每次刷动态规划的题,第一个就是想起来它,在这里简记一下。
有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
1.状态变量:f[i][j]表示i件物品放入容量为j的背包的最大价值(注意,不是背包剩余容量为j,也不是已经放入的容量为j,而是假设目前背包的总容量为j)
2.当背包容量等j的时候我们要考虑第i件物品能否放入?是否放入?
3.如果j<w[i]的时候表示背包容量不够,这个时候背包最大价值应该等于容量等于j的时候i-1件物品的最大价值f[i][j]=f[i-1][j]
4.当背包容量j>=w[i]的时候,分为两种情况 (1)不放 当第i件物品不放入的时候f[i][j]=f[i-1][j] (2)放入 当第i件物品放入背包的时候,f[i][j]=f[i-1][j-w[i]]+v[i],第i件物品让如则需要j-w[i]的容量,这个时候我们应该找第i件物品容量等于j-w[i]最大价值加上当前物品的价值 最后我们需要选取两种选择的最大值f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i])
int f[100][100]; int v[100]; int w[100]; int fun(int n,int m){ for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(j<w[i]){ f[i][j] = f[i-1][j]; } else{ f[i][j] = max(f[i-1][j], f[i-1][j-w[i]]+v[i]); } } } return f[n][m] }
参考链接【0-1背包问题 】详细解析+图解+详细代码_灰太狼!!!的博客-CSDN博客_0-1背包问题
上面就是摘抄的上面这个博主的文章,因为读起来很简单易懂,推荐!