日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬楼梯-完全背包版

發布時間:2024/4/18 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬楼梯-完全背包版 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


將本題條件改為:一步一個臺階,兩個臺階,三個臺階,…,直到 m個臺階。問有多少種不同的方法可以爬到樓頂呢?

思路

1階,2階,… m階就是物品,樓頂就是背包。

每一階可以重復使用,例如跳了1階,還可以繼續跳1階。 問跳到樓頂有幾種方法其實就是問裝滿背包有幾種方法。

此時應該發現這就是一個完全背包問題了!

和題目動態規劃:377. 組合總和 Ⅳ基本就是一道題了。

確定dp數組以及下標的含義

dp[i]:爬到有i個臺階的樓頂,有dp[i]種方法。

確定遞推公式

在動態規劃:494.目標和 、 動態規劃:518.零錢兌換II、動態規劃:377. 組合總和 Ⅳ中,求裝滿背包有幾種方法,遞推公式一般都是dp[i] += dp[i - nums[j]];

而本題的dp[i]有幾種來源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j]

那么遞推公式為:dp[i] += dp[i - j]

dp數組如何初始化

既然遞歸公式是 dp[i] += dp[i - j],那么dp[0] 一定為1,dp[0]是遞歸中一切數值的基礎所在,如果dp[0]是0的話,其他數值都是0了。

下標非0的dp[i]初始化為0,因為dp[i]是靠dp[i-j]累計上來的,dp[i]本身為0這樣才不會影響結果

確定遍歷順序

這是背包里求排列問題,即:1、2 步 和 2、1 步都是上三個臺階,但是這兩種方法不一樣!

所以需將target(背包)放在外循環,將nums(物品)放在內循環。

每一步可以走多次,這是完全背包,內循環需要從前向后遍歷。

class Solution { public:int climbStairs(int n) {vector<int> dp(n + 1, 0);dp[0] = 1;for (int i = 1; i <= n; i++) { // 遍歷背包for (int j = 1; j <= m; j++) { // 遍歷物品if (i - j >= 0) dp[i] += dp[i - j];}}return dp[n];} };

總結

以上是生活随笔為你收集整理的爬楼梯-完全背包版的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。