动态规划
背包问题
0-1背包问题
有一个容量为V的背包,有n种物品,每种物品都有自己的重量w和价值v,每种物品都只有一个,现给出让该背包装最大价值的物品的方案。
子问题是,对于每个物品,装下或者装不下。如果装不下,那么和前i-1个物品的最大价值是一样的。如果能够装下,但是装了之后不一定会大于当前相同体积的最优价值。
状态是d[i][j],表示的是当背包容量为j时,前i个物品所能达到的最大价值。
状态转移方程为
j<w,d[i][j] = d[i-1][j]
j>=w,d[i][j] = max(d[i-1][j], d[i][j-w[i]]+v[i])
for(int i=1;i<=n;i++)
{
for(int j=1;j<=c;j++)
{
if(j>=w[i])
m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);
else
m[i][j]=m[i-1][j];
}
}
优化:
在观察状态转移方程之后,发现dp[i][j]只和二维数组的前一行有关系,因此可以优化为一维数组。在这里j<w的情况不要了,并且j要倒序遍历&#