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

代码随想录算法训练营第三十七天| 52. 携带研究材料 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯(进阶版)

@[TOC](代码随想录算法训练营第三十七天| 52. 携带研究材料 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯(进阶版) )

入营第三十七天
难度:难

  • 计划任务
  • 完成任务

52. 携带研究材料

动态规划五部曲:
1.确定dp数组以及下标含义 dp[i][j]表示从下标[0-i]的物品中选取,每个物品可以选无限次,放进容量为j的背包,价值总和最大
2.确定递推公式 dp[i][j]=Math.max(dp[i-1][j],dp[i][j-weight[i]+value[i])
3.递推数组初始化 第一列:容量为0时,所有物品都是0,第一行:容量大于等于第一件物品的重量时,dp[0][j]=dp[0][j-weight[0])+value[0]
4.确定遍历顺序 可以先物品再容量
5.举例推导递推公式

import java.util.Scanner;
public class Main{public static void main(String[] args){Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int v = scanner.nextInt();int[] weight=new int[n];int[] value =new int[n];for(int i=0;i<n;i++){weight[i]=scanner.nextInt();value[i]=scanner.nextInt();}int[][] dp = new int[n][v+1];for(int i=weight[0];i<=v;i++){dp[0][i]=dp[0][i-weight[0]]+value[0];}for(int i=1;i<n;i++){for(int j=0;j<=v;j++){if(j<weight[i]){dp[i][j]=dp[i-1][j];}else{dp[i][j]=Math.max(dp[i-1][j],dp[i][j-weight[i]]+value[i]);}}}System.out.print(dp[n-1][v]);}
}

518.零钱兑换II

动态规划五部曲:
1.确定dp数组以及下标含义 dp[i][j]表示使用下标为[0-i]的不同类别的硬币能够凑满面值等于j的情况总和
2.确定递推公式 dp[i][j]=dp[i-1][j]+dp[i][j-value[i]]
3.递推数组初始化 第一列为1,第一行当出现整除情况时设置为1
4.确定遍历顺序
5.举例推导递推公式

class Solution {public int change(int amount, int[] coins) {int[][] dp = new int[coins.length][amount+1];for(int i=0;i<coins.length;i++){dp[i][0]=1;}for(int i=coins[0];i<=amount;i++){dp[0][i] += dp[0][i-coins[0]];}for(int i=1;i<coins.length;i++){for(int j=1;j<=amount;j++){if(j<coins[i]){dp[i][j]=dp[i-1][j];}else{dp[i][j]=dp[i-1][j]+dp[i][j-coins[i]];}}}return dp[coins.length-1][amount];}
}

377. 组合总和 Ⅳ

动态规划五部曲:
1.确定dp数组以及下标含义
2.确定递推公式
3.递推数组初始化
4.确定遍历顺序
5.举例推导递推公式

class Solution {public int combinationSum4(int[] nums, int target) {//nums=>物品 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]+dp[i-nums[j]];}}}return dp[target];}
}

70. 爬楼梯(进阶版)

import java.util.Scanner;
public class Main{public static void main(String[] args){int m,n;Scanner scanner = new Scanner(System.in);while(scanner.hasNext()){n = scanner.nextInt();m = scanner.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){dp[i]+=dp[i-j];}}}System.out.print(dp[n]);}}
}

相关文章:

  • 【hadoop】基于hive的B站用户行为大数据分析
  • AMC8 -- 2019年真题解析(中文解析)
  • Vue项目Webpack Loader全解析:从原理到实战配置指南
  • OpenCV颜色变换cvtColor
  • linux安装node版本管理工具(nvm和fnm)
  • 【Axure绘制原型】图片切割、交互动效、热区、动态面板、元件显示隐藏、表单元件、表格、内联框架
  • 【ROS】DWA 规划器
  • 中介者模式(Mediator Pattern)
  • 基于Flask的网络安全渗透知识库系统架构解析
  • 系统架构设计(一):UML与软件架构
  • ICMAN防水触摸芯片 - 复杂环境下精准交互,提升触控体验
  • “盲水印”技术新标杆:blind_watermark加入GitCode
  • 008_ipc概述之socket套接字
  • 泛目录站群技术架构演进观察:2025年PHP+Java混合方案实战笔记​
  • Doris FE 常见问题与处理指南
  • 2025年4月16日华为留学生笔试第二题200分
  • 四大wordpress模板站
  • vscode与vim+cscope+tags热键冲突
  • Apifox下载安装与使用
  • Redis面试——事务
  • 黄仁勋:新一代计算平台GB300三季度上市,AI计算能力每十年提升100万倍
  • 电子凭证会计数据标准推广至全国
  • 武汉警方通报一起故意伤害案件:1人死亡,嫌疑人已被抓获
  • 释新闻|拜登确诊恶性前列腺癌,预后情况如何?
  • 上海青少年书法学习园开园:少年以巨笔书写《祖国万岁》
  • 重庆城市轨道交通拟听证调价:公布两套票价方案,正征求意见