代码随想录算法训练营day 44 |518. 零钱兑换 II、377. 组合总和 Ⅳ

518. 零钱兑换 II

代码随想录

思路:

跟昨天的题一样,递推用组合的累加,但每个硬币可以重复利用,所以是完全背包。一个元素可以被重复利用,所以前序遍历(填充)。有因为是组合问题,所以先遍历物品,保证元素排列有顺序(只出现一次)。

代码:

class Solution {
    public int change(int amount, int[] coins) {
        //dp[i]含义:总金额i的组合数(没有顺序)
        int[] dp = new int[amount + 1];
        dp[0] = 1;
        //组合问题没有顺序,先遍历物品
        for(int i = 0; i < coins.length; i++){
            //每个元素可以重复利用:完全背包问题
            //需要从前往后遍历
            for(int j = coins[i]; j <= amount; j++){
                dp[j] += dp[j - coins[i]];
            }
        }
        return dp[amount];
    }
}

需要注意的点:

377. 组合总和 Ⅳ

代码随想录

思路:

求排列外层循环背包。

代码:

class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target + 1];
        dp[0] = 1;
        //排列问题,先循环背包
        for(int j = 1; j <= target; j++){
            for(int i = 0; i < nums.length; i++){
                if(nums[i] <= j){
                    dp[j] += dp[j - nums[i]];
                }
            }
        }
        return dp[target];
    }
}

需要注意的点:

你可能感兴趣的:(算法,leetcode,动态规划)