欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > 代码随想录算法训练营第三十七天| 52. 携带研究材料 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯(进阶版)

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

2025/4/19 17:52:01 来源:https://blog.csdn.net/z542968z/article/details/147306661  浏览:    关键词:代码随想录算法训练营第三十七天| 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]);}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词