完全なナップザック問題と 01 ナップザックの記述の違いは、完全なナップザック内のアイテムが無限に使用できることです; コードの違いは、走査順序が小さいものから大きいものへと走査されることです。内層と外層の内容は以下に基づいている必要があります。質問は随時調整されます。
ステータス: アイデアをチェックした後、AC。
コードは以下のように表示されます。
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount+1, 0);
dp[0] = 1;
int len = coins.size();
for(int i = 0; i < len; ++i){
for(int j = coins[i]; j < amount+1; ++j){
dp[j] += dp[j-coins[i]];
}
}
return dp[amount];
}
};
ステータス: デバッグ後 AC。
前の質問との違いは組み合わせの順序にあり、[1, 1, 2] と [2, 1, 1] は 2 つの異なる組み合わせとしてカウントされます。この場合、最初にバックパック (j) を横断し、次にアイテム (i) を横断し、同時に判定を追加する必要があります。コードは次のとおりです。
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<double> dp(target+1, 0);
dp[0] = 1;
int len = nums.size();
for(int j = 0; j < target+1; ++j){
for(int i = 0; i < len; ++i){
if(j-nums[i] >= 0){
dp[j] += dp[j-nums[i]];
}
}
}
return int(dp[target]);
}
};