有n种物品,每种只有一个。第i个物品的体积为vi,重量为wi.选一些物品放在容量为c的容器内。使得背包内的物品的总体积不超过c的情况下重量尽量大。
分析:
d(i,j)表示把物品i, i+1,..n放在容器为 j 的背包中的最大总体积。
d(i,j)=max(d(i+1,j),d(i+1,j-v[i])+w[i]) //状态转换方程
下面是代码,答案是d[1][c]
for(int i=n;i>=1;i--)
for(int j=0;j<=c;j++){
d[i][j]=(i==n?0:d[i+1][j]) ; //先不放,当i=n时,由于先不放,所以先赋值为0.
if(j>=v[i]) d[i][j]=max(d[i][j],d[i+1][j-v[i]]+w[i]) //若能放在比较两者之间的大小,选取较大者。
}
同理:
f(i,j)=max(f(i-1,j),f(i-1,j-v[i])+w[i]);
此时,f(i,j)表示将1~i的物品放到容积为j的背包中的最大重量。