leetcode 刷题day36动态规划Part05 背包问题(完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶))

完全背包

完全背包的每件商品都有无限个,和01背包的一不同主要体现在遍历顺序上。为了保证每个物品仅被添加一次,01背包内嵌的循环是从大到小遍历。而完全背包的物品是可以添加多次的,所以要从小到大去遍历。

518. 零钱兑换 II

思路:每一种面额的硬币有无限个是完全背包问题。背包的容量为amount,物品的重量和价值都是硬笔金额。求组合数,

dp[j]表示容量为j时成立的组合数。

代码如下:

java 复制代码
class Solution {
    public int change(int amount, int[] coins) {
        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. 组合总和 Ⅳ

思路:本题与上一题的区别在于本题是求排列的个数。

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

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

代码如下:

java 复制代码
class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp=new int[target+1];
        dp[0]=1;
        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];
    }
}

70. 爬楼梯 (进阶)

思路:dp[i]指爬到有i个台阶的楼顶,有dp[i]种方法。台阶可以重复使用-完全背包问题,从前往后遍历背包。求排列的个数,背包是外层循环。

代码如下:

java 复制代码
import java.util.Scanner;
class Main{
    public static void main(String [] args){
        Scanner scan=new Scanner(System.in);
        int m,n;
        while (scan.hasNextInt()) {
            n=scan.nextInt();
            m=scan.nextInt();
            int[] dp=new int[n+1];
            dp[0]=1;
            for(int j=1;j<=n;j++){
                for(int i=1;i<=m;i++){
                    if(j>=i) dp[j]+=dp[j-i];
                }
            }
            System.out.println(dp[n]);
        }
    }
}
相关推荐
_码力全开_10 分钟前
P1005 [NOIP 2007 提高组] 矩阵取数游戏
java·c语言·c++·python·算法·矩阵·go
墨染点香13 分钟前
LeetCode 刷题【124. 二叉树中的最大路径和、125. 验证回文串】
算法·leetcode·职场和发展
Camel卡蒙13 分钟前
红黑树详细介绍(五大规则、保持平衡操作、Java实现)
java·开发语言·算法
AhriProGramming25 分钟前
Flask-SQLAlchemy精读-双语精选文章
python·算法·flask
孤廖40 分钟前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
BanyeBirth1 小时前
C++动态规划——LIS(最长不下降子序列)
算法·动态规划
小龙报1 小时前
《算法通关指南---C++编程篇(3)》
开发语言·c++·算法·visualstudio·学习方法·visual studio
凤山老林1 小时前
排序算法:详解插入排序
java·开发语言·后端·算法·排序算法
知星小度S2 小时前
算法训练之多源BFS
算法·宽度优先
2201_758875442 小时前
LeetCode:19. 删除链表的倒数第 N 个结点
算法·leetcode·链表