1.0-1背包
1.1求最大价值
一般递推公式:
//先根据题意初始化
for(int i=1;i<w.size();++i)
for(int j=m;j>=w[i];--j)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
注意:这里采用滚动数组的方法,所以背包重量的遍历从后往前
对应题目:力扣1049最后一块石头重量:https://leetcode-cn.com/problems/last-stone-weight-ii/
1.2求达到某价值有效的方法数量
这种题目一般物品价值和重量是相同的。
//初始化,一般令dp[0]=1;
for(int i=0;i<nums.size();++i)
for(int j=m;j>=w[i];--j)
dp[j]+=dp[j-nums[i]];
这里指的是方法的数量
对应题目:力扣494目标和:https://leetcode-cn.com/problems/target-sum/
2.完全背包
2.1顺序无关的方法数量(组合问题)
物品可以无限选取,与1.2类似,只是背包重量的遍历从前往后
//初始化,一般令dp[0]=1;
for(int i=0;i<nums.size();++i)
for(int j=w[i];j<=m;++j)
dp[j]+=dp[j-nums[i]];
对应题目:力扣518零钱兑换II:https://leetcode-cn.com/problems/coin-change-2//
2.2顺序有关的方法数量(排列问题)
物品可以无限选取,且方法的顺序不同可视为不同方法
与2.1类似,只不过外部进行背包重量遍历,内循环遍历物品价值。
//初始化,一般令dp[0]=1;
for(int j=1;j<=m;++j)
for(int i=0;i<nums.size();++i)
if (j>=nums[i])
dp[j]+=dp[j-nums[i]];
对应题目:力扣377:组合总和IV:https://leetcode-cn.com/problems/combination-sum-iv/