- 根据输入的每一个物品,来判断影响的每一个状态,
- 状态是分阶段的,阶段就是每一个物品,和每一个状态。
//阶段逆序
for(int i = n; i >= 1; i--)//i是物品个数,分阶段
{
for(int j = 0; j <= C; j++)//C是最大的容量
{
d[i][j] = (i==n ? 0 : d[i+1][j]);//默认前一个状态
if(j >= V[i])
d[i][j] = max(d[i][j],d[i+1][j-V[i]] + W[i]);//看状态是否需要更新
}
}
//阶段正序
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= C; j++)
{
f[i][j] = (i==1 ? 0 : f[i-1][j]);
if(j >= V[i])
f[i][j] = max(f[i][j],f[i-1][j-V[i]] + W[i]);
}
}
//滚动数组,实质是利用了阶段的可覆盖性
for(int i = 1; i <= n; i++)
{
scanf("%d%d",&V,&W);
for(int j = C; j >= 0; j--)
{
if(j >= V)
f[i][j] = max(f[i][j],f[i-1][j-V] + W);
}
}