首页 > 其他分享 >day45

day45

时间:2023-02-28 23:01:55浏览次数:33  
标签:背包 硬币 int amount 遍历 day45 dp

1、leetcode70 爬楼梯

  1. 需要 n 阶才能到达楼顶,每次可以爬 1 或 2 个台阶。

    • 转化为完全背包问题
      • 背包容量:n
      • 物品【物品可以反复使用】
        • 价值:1、2
        • 重量(所占背包容量):1
  2. 代码

    class Solution {
        public int climbStairs(int n) {
            //dp[j] : 爬到第j阶有dp[j]种方法
            int[] dp = new int[n+1];
            dp[0] = 1;
    
            for(int j=1; j<=n; j++) { //先遍历背包
                for(int i=1; i<=2; i++) { //再遍历物品 【该遍历顺序 ==> 求排列数】
                    if(j >= i) {
                        dp[j] += dp[j-i];
                    }
                }
            }
            
            return dp[n];
        }
    }
    

2、leetcode322 零钱兑换

  1. 完全背包问题

    1. 背包容量:amount
    2. 物品:硬币【每一个硬币均可反复使用】
  2. 代码 【该题可以先遍历物品再遍历背包(求组合数); 也可以先遍历背包再遍历物品(求排列数)】【因为硬币有没有顺序均不影响硬币的最小个数】

    class Solution {
        public int coinChange(int[] coins, int amount) {
            //dp[amount]: 凑成金额为amount的最少硬币个数
            int[] dp = new int[amount+1];
            int max = Integer.MAX_VALUE;
    		
            //因为每次dp[j]都要选最小的,所以非0下标的dp[j]一定要初始为最大值,这样dp[j]在递推的时候才不会被初始值覆盖
            for(int i=0; i<dp.length; i++) dp[i] = max;
            dp[0] = 0;
    
            for(int i=0; i<coins.length; i++) {// 遍历物品
                for(int j=coins[i]; j<= amount; j++) {// 遍历背包
                    if(dp[j-coins[i]] != max) {// 如果dp[j - coins[i]]是初始值则跳
                        dp[j] = Math.min(dp[j], dp[j-coins[i]]+1);
                    }
                }
            }
    
            return dp[amount] == max ? -1 : dp[amount];
        }
    }
    

3、leetcode279 完全平方数

  1. 思路同上一题

  2. 代码

    class Solution {
        public int numSquares(int n) {
            //dp[j]:和为j的完全平方数的最少数量为dp[j]
            int[] dp = new int[n+1];
            int max = Integer.MAX_VALUE;
    		
            //因为每次dp[j]都要选最小的,所以非0下标的dp[j]一定要初始为最大值,这样dp[j]在递推的时候才不会被初始值覆盖
            for(int i=0; i<dp.length; i++) {
                dp[i] = max;
            }
            dp[0] = 0;
    		
            //因为求最小数,遍历顺序无影响,组合排列不会影响最小个数
            for(int j=0; j<=n; j++) {
                for(int i= 1; i*i<=j; i++) {
                    dp[j] = Math.min(dp[j], dp[j-i*i]+1);
                }
            }
    
            return dp[n];
    
        }
    }
    

标签:背包,硬币,int,amount,遍历,day45,dp
From: https://www.cnblogs.com/hzj-bolg/p/17166408.html

相关文章

  • 【算法训练营day45】LeetCode70. 爬楼梯(进阶) LeetCode322. 零钱兑换 LeetCode279. 完
    LeetCode70.爬楼梯(进阶)题目链接:70.爬楼梯(进阶)独上高楼,望尽天涯路可以把爬楼梯看成是一个排序问题加完全背包。classSolution{public:intclimbStairs(intn)......
  • day45 1205周末分页查询(视频) & 6-13 mapper文件标签语法
    实现分页查询在实体类Student设置属性,并获取gettersetter方法privateIntegerpageNo;//页码privateIntegerrowCount;//单页查询行数//此处为getset方法......
  • 进入python的世界_day45_前端——JS的学习(和学python基础一样的学)
    一、JS介绍​ 是一门编程语言,可以进行逻辑运算,但是跟java没有关系主要是为了蹭热度​ 全称是JavaScript,曾经叫过ECMASript,创造出这门语言的公司已经倒闭完整的Java......
  • day45前端开发基础(1)
    目录前端与后端的概念前端三剑客前端前戏HTTP协议HTML简介HTML概览预备知识head内常见标签body内基本标签常见符号body内布局标签body内常用标签列表标签表格标签表单标签......
  • day45
    webtomcat数据源context中添加连接池通过数据源获取数据库连接service层service层:业务逻辑层,不做任何数据库操作,只负责指挥dao层(调用dao层)service层中的方......
  • 代码随想录day45 | 70. 爬楼梯 322. 零钱兑换 279. 完全平方数
    70.爬楼梯题目|文章思路这道题目要求有序,因此是全背包的排列做法。1.数组下标以及含义dp[i]:爬到n台阶一共有dp[i]种方法。2.递推关系dp[i]+=dp[i-j];3.初始......
  • day45-JDBC和连接池01
    JDBC和连接池011.JDBC概述基本介绍JDBC为访问不同的数据库提供了同一的接口,为使用者屏蔽了细节问题Java程序员使用JDBC,可以连接任何提供了jdbc驱动程序的数据库系统......
  • 前端Axios-Day45
    Axios源码分析:①模拟Axios对象的创建过程:   1.Axios构造函数本身应具有defaults(默认配置参数)和intercepters(拦截器参数)2.在Axios原型上添加request、get、p......
  • 学习python-Day45
    今日学习内容一、表单标签补充知识name相当于字典的键,value相当于字典值。对于前端到后端传数据需要用到name属性,不然无法被后端识别该数据是什么。form表单在朝......
  • python学习Day45
    Day45今日内容概要字符编码与配置文件数据库存储引擎创建表的完整语法MySQL字段类型—整型MySQL字段类型—浮点型MySQL字段类型—字符型数字的含义MySQL字段类......