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

news/2024/10/8 6:59:29 标签: leetcode, 动态规划, 算法

完全背包

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

518. 零钱兑换 II

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

代码如下:

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循环遍历物品。

代码如下:

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]种方法。台阶可以重复使用-完全背包问题,从前往后遍历背包。求排列的个数,背包是外层循环。

代码如下:

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]);
        }
    }
}

http://www.niftyadmin.cn/n/5693752.html

相关文章

问:说说JRE、JDK、JVM 及 JIT都是干嘛的?

JRE、JDK、JVM及JIT是Java生态系统中的四个核心概念&#xff0c;它们在Java开发和运行过程中扮演着不同的角色。 概念定义与描述功能与特点相互关系JRE (Java Runtime Environment)Java运行时环境&#xff0c;是运行Java程序所必需的环境。它包括了Java虚拟机(JVM)和Java核心类…

Linux实践|设置静态 IP 地址

引言 如果您是 Linux 系统管理员&#xff0c;那么您将需要在系统上配置网络。与可以使用动态 IP 地址的台式机不同&#xff0c;在服务器基础设施上&#xff0c;您需要设置静态 IP 地址&#xff08;至少在大多数情况下&#xff09;。 本文[1]旨在向您展示如何在最常用的 Linux 发…

TensorFlow与Pytorch的转换——1简单线性回归

import numpy as np# 生成随机数据 # 生成随机数据 x_train np.random.rand(100000).astype(np.float32) y_train 0.5 * x_train 2 import tensorflow as tf# 定义模型 W tf.Variable(tf.random.normal([1])) b tf.Variable(tf.zeros([1])) y W * x_train b # 定义损失函…

github项目学习——ruoyi-vue-pro

打算再写一个合集&#xff0c;深入学习一下优秀的开源项目ruoyi-vue-pro。 最近刚开始坚持写博客&#xff0c;条理性和流畅性可能都不太好&#xff0c;有问题或想法可以留言讨论。 项目简介 ruoyi-vue-pro它是一款开源可商用的后台管理框架&#xff0c;借鉴了另一个项目ruoyi。…

SparkCore与FlinkCore的区别有哪些

1.架构理念方面: Spark Core: Spark 基于 RDD&#xff08;弹性分布式数据集&#xff09;的概念构建。RDD 是一个不可变的、分布式的对象集合&#xff0c;它可以在集群中的多个节点上进行并行计算。例如&#xff0c;在处理大规模的日志文件时&#xff0c;Spark 可以将日志文件…

Oracle登录报错-ORA-01017: invalid username/password;logon denied

接上文&#xff1a;Oracle创建用户报错-ORA-65096: invalid common user or role name 我以为 按照上文在PDB里创建了用户&#xff0c;我以为就可以用PLSQL远程连接了&#xff0c;远程服务器上也安装了对应版本的Oracle客户端&#xff0c;但是我想多了&#xff0c;客户只是新建…

linux信号 | 信号的补充知识

前言&#xff1a;本节内容主要是一些linux信号的周边知识或者补充知识。 对于信号的学习&#xff0c; 学习了信号概念&#xff0c; 产生&#xff0c; 保存与捕捉就已经算是认识我们的信号了。 如果想要知道更多关于信号的知识也可以看一下本篇文章。 ps&#xff1a;本篇内容适…

常用规则波形的简单生成方法

在信号处理应用中&#xff0c;经常需要生成各种规则的标准信号&#xff0c;如正弦信号、方波信号、三角波信号等&#xff0c;虽然现在有很多现成的库函数可供调用&#xff0c;但是理解这些波形的生成原理&#xff0c;在需要的时候简单敲一两行代码就把它实现出来&#xff0c;不…