自学内容网 自学内容网

代码随想录-算法训练营day45(动态规划07:爬楼梯进阶本,零钱兑换,完全平方数)

第九章 动态规划part07
 
● 70. 爬楼梯 (进阶)
● 322. 零钱兑换 
● 279.完全平方数 
 
 详细布置 
 
 70. 爬楼梯 (进阶) 
 
这道题目 爬楼梯之前我们做过,这次再用完全背包的思路来分析一遍 
 
https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85%E7%89%88%E6%9C%AC.html  
 
 322. 零钱兑换  
 
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
 
这句话结合本题 大家要好好理解。
视频讲解:https://www.bilibili.com/video/BV14K411R7yv
https://programmercarl.com/0322.%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2.html  
 
 279.完全平方数  
本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做 
视频讲解:https://www.bilibili.com/video/BV12P411T7Br
https://programmercarl.com/0279.%E5%AE%8C%E5%85%A8%E5%B9%B3%E6%96%B9%E6%95%B0.html  
 
往日任务
● day 1 任务以及具体安排:https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY  
● day 2 任务以及具体安排:https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG  
● day 3 任务以及具体安排:https://docs.qq.com/doc/DUGdqYWNYeGhlaVR6 
● day 4 任务以及具体安排:https://docs.qq.com/doc/DUFNjYUxYRHRVWklp 
● day 5 周日休息
● day 6 任务以及具体安排:https://docs.qq.com/doc/DUEtFSGdreWRuR2p4 
● day 7 任务以及具体安排:https://docs.qq.com/doc/DUElCb1NyTVpXa0Jj 
● day 8 任务以及具体安排:https://docs.qq.com/doc/DUGdsY2JFaFhDRVZH 
● day 9 任务以及具体安排:https://docs.qq.com/doc/DUHVXSnZNaXpVUHN4 
● day 10 任务以及具体安排:https://docs.qq.com/doc/DUElqeHh3cndDbW1Q 
●day 11 任务以及具体安排:https://docs.qq.com/doc/DUHh6UE5hUUZOZUd0 
●day 12 周日休息 
●day 13 任务以及具体安排:https://docs.qq.com/doc/DUHNpa3F4b2dMUWJ3 
●day 14 任务以及具体安排:https://docs.qq.com/doc/DUHRtdXZZSWFkeGdE 
●day 15 任务以及具体安排:https://docs.qq.com/doc/DUHN0ZVJuRmVYeWNv 
●day 16 任务以及具体安排:https://docs.qq.com/doc/DUHBQRm1aSWR4T2NK 
●day 17 任务以及具体安排:https://docs.qq.com/doc/DUFpXY3hBZkpabWFY 
●day 18 任务以及具体安排:https://docs.qq.com/doc/DUFFiVHl3YVlReVlr 
●day 19 周日休息
●day 20 任务以及具体安排:https://docs.qq.com/doc/DUGFRU2V6Z1F4alBH  
●day 21 任务以及具体安排:https://docs.qq.com/doc/DUHl2SGNvZmxqZm1X 
●day 22 任务以及具体安排:https://docs.qq.com/doc/DUHplVUp5YnN1bnBL  
●day 23 任务以及具体安排:https://docs.qq.com/doc/DUFBUQmxpQU1pa29C 
●day 24 任务以及具体安排:https://docs.qq.com/doc/DUEhsb0pUUm1WT2NP  
●day 25 任务以及具体安排:https://docs.qq.com/doc/DUExTYXVzU1BiU2Zl 
●day 26 休息 
●day 27 任务以及具体安排:https://docs.qq.com/doc/DUElpbnNUR3hIbXlY 
●day 28 任务以及具体安排:https://docs.qq.com/doc/DUG1yVHdlWEdNYlhZ  
●day 29 任务以及具体安排:https://docs.qq.com/doc/DUHZYbWhwSHRCRmp3 
●day 30 任务以及具体安排:https://docs.qq.com/doc/DUEdTVVhxbnJiY3BR 
●day 31 任务以及具体安排:https://docs.qq.com/doc/DUG1PQ1ZZY2xXY1ly 
●day 32 任务以及具体安排:https://docs.qq.com/doc/DUGFEdGFWeVhleFF1 
●day 33 周日休息 
●day 34 任务以及具体安排:https://docs.qq.com/doc/DUEh5WFVlQkp1U0p4  
●day 35 任务以及具体安排:https://docs.qq.com/doc/DUFRWc3BGRHFXZ1pO  
●day 36 任务以及具体安排:https://docs.qq.com/doc/DUERGbnhhRkFRVENZ 
●day 37 任务以及具体安排:https://docs.qq.com/doc/DUFVRd3p5SHFMSExQ  
●day 38 任务以及具体安排:https://docs.qq.com/doc/DUGNUdVpoT0VJR01l 
●day 39 任务以及具体安排:https://docs.qq.com/doc/DUE55cVJ5WkNoREhS 
●day 40 周日休息
●day 41 任务以及具体安排:https://docs.qq.com/doc/DUFhIUXRFYnVGUkFp 
●day 42 任务以及具体安排:42 第八章 动态规划 
●day 43 任务以及具体安排:43第八章 动态规划 
●day 44 任务以及具体安排:44 第八章 动态规划

day45

爬楼梯进阶版

完全背包问题

 import java.util.Scanner;
 class Main{
     public static void main(String [] args){
         Scanner sc = new Scanner(System.in);
         int m, n;
         while (sc.hasNextInt()) {
             // 从键盘输入参数,中间用空格隔开
             n = sc.nextInt();
             m = sc.nextInt();
 ​
             // 求排列问题,先遍历背包再遍历物品
             int[] dp = new int[n + 1];
             dp[0] = 1;
             for (int j = 1; j <= n; j++) {
                 for (int i = 1; i <= m; i++) {
                     if (j - i >= 0) dp[j] += dp[j - i];
                 }
             }
             System.out.println(dp[n]);
         }
     }
 }

零钱兑换

 class Solution {
     public int coinChange(int[] coins, int amount) {
         //dp[j] = Math.min( dp[j - coins[i]] + 1, dp[j])
         //可以多次使用,背包从前向后遍历,多次添加coins[i]
         //求的是最小个数,跟是排列还是组合无关,所以遍历顺序可以颠倒
         int[] dp = new int[amount + 1];
         for(int j = 1; j <= amount ;j++){
             dp[j] = Integer.MAX_VALUE;//需要被递推公式覆盖,所以取最大值
         }
         dp[0] = 0;//初始化
         for( int i = 0; i < coins.length; i++){
             for( int j = coins[i] ; j <= amount; j++){
                 if(dp[j-coins[i]] != Integer.MAX_VALUE ) dp[j] = Math.min( dp[j - coins[i]] + 1, dp[j]);
                 //也就是如果dp[j-coins[i]]这种情况不存在,根本凑不出来,就不做运算
                 //因为公式里有dp[j - coins[i]] + 1,其实也是为了防止溢出
             }
         }
         return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
     }
 }

完全平方数

 class Solution {
     public int numSquares(int n) {
         int max = Integer.MAX_VALUE;
         int[] dp = new int[n + 1];
         for (int j = 0; j <= n; j++) {
             dp[j] = max;
         }
   //Arrays.fill(dp, Integer.MAX_VALUE);
         //当和为0时,组合的个数为0
         dp[0] = 0;
         // 遍历物品,物品从1到根号n
         for (int i = 1; i * i <= n; i++) {
             // 遍历背包
             for (int j = i * i; j <= n; j++) {
                 //if (dp[j - i * i] != max) {
                     dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
                 //}
     //不需要這個if statement,因爲在完全平方數這一題不會有"湊不成"的狀況發生( 一定可以用"1"來組成任何一個n),故comment掉這個if statement。
         //牛哇
             }
         }
         return dp[n];
     }
 }

感谢大佬分享:

代码随想录-算法训练营day45【动态规划07:爬楼梯(进阶)、零钱兑换、完全平方数】-CSDN博客


原文地址:https://blog.csdn.net/weixin_61931006/article/details/144328189

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!