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