当前位置: 首页 > news >正文

代码随想录第三十八天(完全背包问题)|爬楼梯(第八期模拟笔试)|零钱兑换|完全平方数

爬楼梯(第八期模拟笔试)

该题也是昨天的完全背包排列问题,解法相同,将遍历顺序进行调换

import java.util.*;
public class Main{public static void main (String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();int m=sc.nextInt();int[] step=new int[m+1];for(int i=0;i<m+1;i++){step[i]=i;}maxMethod(n,step);}public static void maxMethod(int target,int[] step){int[] dp=new int[target+1];dp[0]=1;for(int j=1;j<target+1;j++){for(int i=0;i<step.length;i++){if(j>=step[i]){dp[j]+=dp[j-step[i]];}}}System.out.println(dp[target]);}
}

零钱兑换

这一题也是求放入背包中的物品数,但是不是就放满指定容量背包的最大物品数,而是最小物品数。求最少物品数和最大物品数的区别在于两个地方,一个是递推公式,还有就是初始化,因为要求最小物品数,所以除了dp[0]以外,所有的元素都需要初始化成int的最大值,才能保证在递推公式计算中被覆盖。

  1. dp[j]代表的是装满容量为j的背包所需的最少硬币数dp[j]
  2. 递推公式:dp[j]=min(dp[j],dp[j-coins[i]]+1);在这里需要先进行判断,因为dp[j]可能没有被重新计算覆盖,会为最大值,加1会循环到int的最小值加一。若是所有的dp[j]一定能由之前的状态推出的话,就不需要这个判断。
  3. 初始化:dp[0]=1,其他的都为Integer_MAX_VALUE
  4. 遍历顺序:这里是求的物品数,先遍历背包和先遍历物品都是一样的,只有求组合数的时候才有区别
import java.util.*;
class Solution {public int coinChange(int[] coins, int amount) {int[] dp=new int[amount+1];for(int i=1;i<amount+1;i++){dp[i]=Integer.MAX_VALUE;}for(int i=0;i<coins.length;i++){for(int j=coins[i];j<amount+1;j++){//因为此时初始值都为int的最大值,再加一的话会变成int的最小值+1;所以要判断if(dp[j-coins[i]]!=Integer.MAX_VALUE){dp[j]=Math.min(dp[j],dp[j-coins[i]]+1);}}}if(dp[amount]==Integer.MAX_VALUE){return -1;}else{return dp[amount];}}
}

完全平方数

这一题和上面一题解法一样,只是要先将完全平方数求出。再进行动规计算

class Solution {public int numSquares(int n) {List<Integer> arr=new ArrayList();for(int i=0;i<=n;i++){double j=Math.sqrt(i);if(j%1==0){arr.add(i);}}int[] nums=new int[arr.size()];for(int i=0;i<nums.length;i++){nums[i]=arr.get(i);}int[] dp=new int[n+1];for(int i=1;i<n+1;i++){dp[i]=Integer.MAX_VALUE;}for(int i=0;i<nums.length;i++){for(int j=nums[i];j<n+1;j++){if(dp[j-nums[i]]!=Integer.MAX_VALUE){dp[j]=Math.min(dp[j],dp[j-nums[i]]+1);}}}return dp[n];}
}

http://www.lryc.cn/news/342333.html

相关文章:

  • idea常用知识点随记
  • (双指针) 有效三角形的个数 和为s的两个数字 三数之和 四数之和
  • 力扣每日一题114:二叉树展开为链表
  • Linux系统下使用LVM扩展逻辑卷的步骤指南
  • 探索AI编程新纪元:从零开始的智能编程之旅
  • RustGUI学习(iced)之小部件(三):如何使用下拉列表pick_list?
  • 【OceanBase诊断调优】—— Unit 迁移问题的排查方法
  • [极客大挑战 2019]PHP
  • 数据结构之跳跃表
  • 搜维尔科技:动作捕捉解决方案:销售、服务、培训和支持
  • 数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)
  • 刷代码随想录有感(58):二叉树的最近公共祖先
  • [开发|安卓] Android Studio 开发环境配置
  • 开发 Chrome 浏览器插件入门
  • 在数字化转型的浪潮中,CBDB百数服务商如何破浪前行?
  • 程序员的实用神器
  • spss 导入数据的时候 用于确定数据类型的值所在的百分比95%是什么意思,数据分析,医学数据分析
  • Python进阶之-上下文管理器
  • 什么年代了,还在拿考勤说事
  • 泰迪智能科技中职大数据实验室建设(职业院校大数据实验室建设指南)
  • Qt QThreadPool线程池
  • 无人机+三维建模:倾斜摄影技术详解
  • Window(Qt/Vs)软件添加版本信息
  • 工厂模式+策略模式完成多种登录模式的实现
  • 赋能企业数字化转型 - 易点易动固定资产系统与飞书实现协同管理
  • Sectigo 通配符SSL证书的优势分析!
  • nuxt2路由,以及重构以前项目,路由使用
  • eureka报错:链接8761被拒绝
  • Linux 手动部署JDK21 环境
  • 【c2】编译预处理,gdb,makefile,文件,多线程,动静态库