1 条题解
-
0
本题实际上是一个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; }
- 1
信息
- ID
- 110
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 48
- 已通过
- 24
- 上传者