アルゴリズム問題チェックイン44日目 - ナップザック問題 | 518.交換交換Ⅱ、377.組み合わせ和Ⅳ

完全なナップザック問題と 01 ナップザックの記述の違いは、完全なナップザック内のアイテムが無限に使用できることです; コードの違いは、走査順序が小さいものから大きいものへと走査されることです。内層と外層の内容は以下に基づいている必要があります。質問は随時調整されます。 

518. 交換交換 II - LeetCode

ステータス: アイデアをチェックした後、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];
    }
};

377. 組み合わせ和 IV - LeetCode 

ステータス: デバッグ後 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]);
    }
};

おすすめ

転載: blog.csdn.net/qq_40395888/article/details/132466295