代码随想录算法训练营第四十三天| 518. 零钱兑换 II、 377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)

LeetCode 518. 零钱兑换 II

题目链接:https://leetcode.cn/problems/coin-change-ii/description/

文章链接:https://programmercarl.com/0518.零钱兑换II.html

思路

 * 零钱兑换,每个零钱可以取多次来凑成amount
 * 完全背包问题:装满容量为amount的背包有多少种装法
 * dp[j]表示装满容量为j的背包有多少种装法,那么对于第i个物品,可以选择装,也可以不装
 * 如果不装dp[j] = dp[j-1],如果装,dp[j] = dp[j-coins[i]],
java 复制代码
    public int change(int amount, int[] coins) {
        //递推表达式
        int[] dp = new int[amount + 1];
        //初始化dp数组,表示金额为0时只有一种情况,也就是什么都不装
        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];
    }

LeetCode 377. 组合总和 Ⅳ

题目链接:https://leetcode.cn/problems/combination-sum-iv/description/

文章链接:https://programmercarl.com/0377.组合总和Ⅳ.html

思路

/**
 * 组合总和IV:题目可以理解为装满容量为target的有多少种装法,
 * 因为我们求的是排列数,所以要先遍历背包,在遍历物品
 * 比如,外层循环固定coins【1】,在内层循环遍历背包时,随着背包不断增加,coins【1】可以重复被添加进来,而由于外层循环固定了,
 * 因此coins【2】只能在下一次外层循环添加进不同大小的背包中,这么看的话,coins【i+1】只能在coins【i】之后了;
 * 如果先遍历背包后遍历物品,那么外层循环先固定背包大小j,然后在大小为j的背包中循环遍历添加物品,
 * 然后在下次外层循环背包大小变为j+1,此时仍要执行内层循环遍历添加物品,
 * 也就会出现在上一轮外层循环中添加coins【2】的基础上还能再添加coins【1】的情况,那么就有了coins【1】在coins【2】之后的情况了。
 */
java 复制代码
        public int combinationSum4(int[] nums, int target) {
            int[] dp = new int[target + 1];
            dp[0] = 1;
            for (int i = 0; i <= target; i++) {
                for (int j = 0; j < nums.length; j++) {
                    if (i >= nums[j]) {
                        dp[i] += dp[i - nums[j]];
                    }
                }
            }
            return dp[target];
        }

LeetCode 70. 爬楼梯 (进阶)

题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?

题目链接:https://leetcode.cn/problems/combination-sum-iv/description/

文章链接:https://programmercarl.com/0377.组合总和Ⅳ.html

思路

 * 爬楼梯进阶:装满为n的背包有多少中装法
 * 求排列问题
java 复制代码
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m, n;
        while (sc.hasNextInt()) {
            m = sc.nextInt();
            n = sc.nextInt();
            int[] dp = new int[n + 1];
            dp[0] = 1;
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= m; j++) {
                    if (i - j >= 0) {
                        dp[i] = dp[i] + dp[i-j];
                    }
                }
            }
            System.out.println(dp[n]);
        }
    }
相关推荐
hsling松子4 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1234 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝4 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King5 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家6 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain6 小时前
算法 | 位运算(哈希思想)
算法
Kalika0-07 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20248 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh9 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝