1 条题解
-
0
这是一道动态规划题目,难点主要在于找状态
本问题可归约为经典的背包问题。 假设一个对集装箱的重量差的绝对值是 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
- 上传者