1 条题解

  • 0
    @ 2023-11-25 22:30:11

    这是一道动态规划题目,难点主要在于找状态

    本问题可归约为经典的背包问题。 假设一个对集装箱的重量差的绝对值是 s,那么它实际可以得到的重量差就是-s 或 s。 我们不妨对取值进行一下平移,让每对集装箱可以取到的重量差为 0 和 2s。这样,一对集 装箱的重量差值是“取正值还是负值”就转化为背包的“取与不取”了。 那么,我们求解的目标会怎样变化呢?本来,我们的目标是让取值的总和为 0。现在, 我们对每对集装箱的重量差的取值作了平移,平移的距离为 s。那么,最后的取值总和就应 该是∑s,即所有骨牌的平移距离之和。

    //动态转移方程f[i][j]=min{f[i-1][i-a[j]],f[i-1][i+a[j]]+1}
    

    程序主要部分如下:

    memset(f,0x7F,sizeof(f));
    	f[0][0+N]=0;
    	//动态转移方程f[i][j]=min{f[i-1][i-a[j]],f[i-1][i+a[j]]+1}
    	for(int i=1;i<=n;i++)
    	{
    		int cha=a[i]-b[i];
    		for (int j=-5000;j<=5000;j++)
    		{
    			f[i][j+N]=min(f[i-1][j-cha+N],f[i-1][j+cha+N]+1);
    		}
    	} 
    	for (int i=0;i<=5000;i++)
    	{
    		int ans=min(f[n][i+N],f[n][-i+N]);
    		if (ans<=1000)
    		{
    			printf("%d",ans);	
    			return 0;	
    		}
    	}
    
    • 1

    信息

    ID
    560
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    35
    已通过
    3
    上传者