遍历顺序:
dp[j] | 背包容量0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
物品0 | 1 | 1 | 1 | 1 | 1 | 1 |
物品1 | 0 | 0 | 2 | 2 | 3 | 3 |
物品2 | 0 | 0 | 0 | 0 | 0 | 4 |
int change(int amount, vector<int>& coins) {
vector<int> dp(amount+1,0);
dp[0]=1;
for(int i=0;i<coins.size();i++){
for(int j=coins[i];j<=amount;j++){
dp[j]+=dp[j-coins[i]];
}
}
return dp[amount];
}
如果外层背包容量,内层物品嵌套,背包容量为1时,可以放下物体0,有1种。
背包容量为2时,可以放下物品0,1,有两种:1,1和2
背包容量为3时,dp[3]=dp[2]+dp1 +(在1里放入2)出现重复
dp[j] | 背包容量0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 | |
0 | 0 | 2 | 3 | 5 | 0 | |
0 | 0 | 0 | 0 | 0 | 9 |
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
int sum=0;
/*
for(int i=0;i
vector<int> dp(target+1,0);
dp[0]=1;
for(int j=0;j<=target;j++){
for(int i=0;i<nums.size();i++){
if(j>=nums[i] && dp[j] < INT_MAX - dp[j - nums[i]]) dp[j]+=dp[j-nums[i]];
}
}
return dp[target];
}
};