⭐️01背包和多重背包的比较(组合数问题)
- 共同点:
- dp[0][0]=1;
- 遍历顺序为二维数组遍历,从上到下,从左到右
- 一维度的dp数组递推公式:
d p [ j ] = d p [ j ] + d p [ j − w e i g h t [ i ] ] dp[j]=dp[j]+dp[j-weight[i]] dp[j]=dp[j]+dp[j−weight[i]]
- 不同点
- 多重背包物品无限,不用考虑重复问题【重复也是一种组合方式】
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − w e i g h t [ i ] ] dp[i][j]=dp[i-1][j]+dp[i][j-weight[i]] dp[i][j]=dp[i−1][j]+dp[i][j−weight[i]]
- 01背包,物品只有一件,所以 禁止重复
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i − 1 ] [ j − w e i g h t [ i ] ] dp[i][j]=dp[i-1][j]+dp[i-1][j-weight[i]] dp[i][j]=dp[i−1][j]+dp[i−1][j−weight[i]]
- 多重背包的一维dp数组从前往后遍历【不怕重复,重复也是一种组合方式】
for(int i=0;i<coins.size();i++)
{
for(int j=coins[i];j<amount+1;j++)
{
dp[j]=dp[j]+dp[j-coins[i]];
}
}
- 01背包的一维dp数组从后往前遍历【==不能重复加入相同物品,每件物品只有一件】
for(int i=0;i<n;i++)
{
for(int j=key;j>=nums[i];j–)
{
dp[j]+=dp[j-nums[i]];
}
}