代码随想录|动态规划 518. 零钱兑换 II 377. 组合总和 Ⅳ

518. 零钱兑换 II

题目

参考文章

思路:本题就是完全背包的形式,元素可以重复利用

一维数组的形式,先遍历物品,再遍历背包容量.得到的是组合数,遍历顺序不能换 dp[j]+=dp[j-coins[i]]

二维数组的遍历形式两层for循环可以调换  dp[i][j] = dp[i - 1][j] +  dp[i][j - coins[i]]

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

这里是求组合数

代码:

class Solution {
    public int change(int amount, int[] coins) {
        int[] dp=new int[amount+1];
        //初始化dp数组,默认当金额为零时,只有一种情况
        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;//targe=0的个数只有一个
        for(int j=0;j<=target;j++){//先遍历背包容量
            for(int i=0;i<nums.length;i++){//再遍历物品数量
                if(j>=nums[i]){
                    dp[j]+=dp[j-nums[i]];
                }
            }
        }
        return dp[target];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值