LeetCode 518 零钱兑换 II

LeetCode 518 零钱兑换 II

🟡 中等

https://leetcode.cn/problems/coin-change-ii/description/

对于本层输入index 有选和不选,简单递归。

  • 注意 一定要等index 到最后才能返回,中途不能返回。
class Solution {

public:

    int sel_not(vector<int>& coins, int index,int cap){

        // if(cap==0) return 1;

        if(index==coins.size()){

            if(cap==0) return 1;

            return 0;

        }

        if(cap>=coins[index]){

            return sel_not(coins,index+1,cap)+sel_not(coins,index,cap-coins[index]);

        }else{

            return sel_not(coins,index+1,cap);

        }

    }

    int change(int amount, vector<int>& coins) {

        return sel_not(coins,0,amount);

    }

};

改为动态规划

内层循环本来是 0-amount,但是不满足if条件就什么也不做,因此直接将if 条件转到for循环上面。

class Solution {

public:

    int sel_not(vector<int>& coins, int index, int cap) {

        // if(cap==0) return 1;

        if (index == coins.size()) {

            if (cap == 0)

                return 1;

            return 0;

        }

        if (cap >= coins[index]) {

            return sel_not(coins, index + 1, cap) +

                   sel_not(coins, index, cap - coins[index]);

        } else {

            return sel_not(coins, index + 1, cap);

        }

    }

    int change(int amount, vector<int>& coins) {

        int dp[amount + 1];

        memset(dp, 0, sizeof dp);

        dp[0] = 1;

        for (int i = coins.size() - 1; i >= 0; i--) {

            for (int j = coins[i]; j <=amount; j++) {

                // if (j >= coins[i]) {

                    dp[j] = dp[j]+dp[j-coins[i]];

                // }

            }

        }

        // return sel_not(coins, 0, amount);

        return dp[amount];

    }

};