01背包问题
有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
动态规划主要思路:
矩阵内容解释:
- 物品编号 i i i表示考虑编号 < = i <=i <=i的物品
- 背包容量 j j j表示考虑容量为 j j j的背包
- 矩阵内数值为当前情况下能装下的最多物品价值
矩阵更新过程(DP算法):
完全背包问题
在01背包问题的基础上,每个物品可选的数量变为无数个。
求解过程只需要对01背包问题的求解过程进行简单修改即可,将每个物品的装包过程扩展为可以装无数次,直到无法装下。
for(int i=1; i<=n; i++)
for(int j=1; j<=W; j++)
{
dp[i][j]=dp[i-1][j];
for(int k=1; k*w[i]<=j; k++)
if (k*w[i] > j)
break;
dp[i][j]=max(dp[i][j],dp[i][j-k*w[i]]+k*v[i]);
}
[j],dp[i][j-k*w[i]]+k*v[i]);
}