AcWing 1024. 01背包问题2 (当问题中没有直接了当告诉你价值时):装箱问题
原题链接
简单
作者:
啦啦啦123
,
2021-05-02 22:13:16
,
所有人可见
,
阅读 272
此题有体积但是没有价值。 而此题求的就是剩余最小的体积。 所以可以将体积也当作价值。计算出体积最大的情况。然后就算出了剩余最小的体积。
代码实现:
# include <iostream>
using namespace std;
const int N = 40 , M = 20010;
int w[N];
int f[N][M];
int f1[M];
int m,n;
int main()
{
scanf("%d %d",&m,&n);
for(int i = 1 ; i <= n ; i++)
{
scanf("%d",&w[i]);
}
/* //二维
for(int i = 1 ; i <= n ; i++)
{
for(int j = 0 ; j <= m ; j++)
{
f[i][j] = f[i - 1][j];
if(j >= w[i])
{
f[i][j] = max(f[i][j],f[i - 1][j - w[i]] + w[i]);
}
}
}
printf("%d\n",m - f[n][m]);*/
//一维:
for(int i = 1 ; i <= n ; i++)
{
for(int j = m ; j >= w[i] ; j--)
{
f1[j] = max(f1[j] , f1[j - w[i]] + w[i]);
}
}
printf("%d\n",m - f1[m]);
return 0;
}