信息
- ID
- 110
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 82
- 已通过
- 39
- 上传者
本题实际上是一个0/1背包问题
之前的要求是让利益最大,而现在要求体积最大
之前的价值c[i]在本题中其实就是体积w[i]
f[i][j]表示前i个物品在j的空间中最多能占据多少空间
状态转移方程:f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+w[i])
如果进行空间优化的话,就可以得出状态转移方程:f[j]=max(f[j],f[j-w[i]]+w[i])(注意要逆推)
#include<cstdio>
using namespace std;
int n,v,w[200020],f[200020];
int main()
{
scanf("%d%d",&v,&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
for (int i=1;i<=n;i++)
{
for (int j=v;j>=1;j--)
{
if (j-w[i]>=0)
f[j]=f[j]>f[j-w[i]]+w[i]?f[j]:f[j-w[i]]+w[i];
}
}
printf("%d",v-f[v]);
return 0;
}