国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Leetcoder Day39| 動態(tài)規(guī)劃part06 完全背包問題

這篇具有很好參考價值的文章主要介紹了Leetcoder Day39| 動態(tài)規(guī)劃part06 完全背包問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

完全背包理論

有N件物品和一個最多能背重量為W的背包。第i件物品的重量是weight[i],得到的價值是value[i] 。每件物品都有無限個(也就是可以放入背包多次),求解將哪些物品裝入背包里物品價值總和最大。

示例:

背包最大重量為4。

物品為:

重量 價值
物品0 1 15
物品1 3 20
物品2 4 30

每件商品都有無限個!

問背包能背的物品最大價值是多少?

完全背包和01背包問題唯一不同的地方就是,每種物品有無限件。

同樣leetcode上沒有純完全背包問題,都是需要完全背包的各種應(yīng)用,需要轉(zhuǎn)化成完全背包問題,所以這里還是以純完全背包問題進行講解理論和原理。

01背包和完全背包唯一不同就是體現(xiàn)在遍歷順序上,因此直接針對遍歷順序經(jīng)行分析!01背包內(nèi)嵌的循環(huán)是從大到小遍歷,為了保證每個物品僅被添加一次,而完全背包的物品是可以多次添加的,所以這里就要從小到達遍歷。

其次是先后問題,為什么遍歷物品在外層循環(huán),遍歷背包容量在內(nèi)層循環(huán)?

在01背包中,如果是定義了二維數(shù)組,則先遍歷誰都可以,而定義一維數(shù)組后,兩個for循環(huán)先后循序一定是先遍歷物品,再遍歷背包容量。

在完全背包中,對于一維dp數(shù)組來說,其實兩個for循環(huán)嵌套順序是無所謂的!因為dp[j] 是根據(jù) 下標j之前所對應(yīng)的dp[j]計算出來的。 只要保證下標j之前的dp[j]都是經(jīng)過計算的就可以了。

遍歷物品在外層循環(huán),遍歷背包容量在內(nèi)層循環(huán),狀態(tài)如圖:

Leetcoder Day39| 動態(tài)規(guī)劃part06 完全背包問題,Leetcode算法刷題記錄,動態(tài)規(guī)劃,算法

遍歷背包容量在外層循環(huán),遍歷物品在內(nèi)層循環(huán),狀態(tài)如圖:

Leetcoder Day39| 動態(tài)規(guī)劃part06 完全背包問題,Leetcode算法刷題記錄,動態(tài)規(guī)劃,算法

因此,完全背包中,兩個for循環(huán)的先后循序,都不影響計算dp[j]所需要的值(這個值就是下標j之前所對應(yīng)的dp[j])

518.零錢兌換II

給定不同面額的硬幣和一個總金額。寫出函數(shù)來計算可以湊成總金額的硬幣組合數(shù)。假設(shè)每一種面額的硬幣有無限個。

示例 1:

  • 輸入: amount = 5, coins = [1, 2, 5]
  • 輸出: 4

解釋: 有四種方式可以湊成總金額:

  • 5=5
  • 5=2+2+1
  • 5=2+1+1+1
  • 5=1+1+1+1+1

示例 2:

  • 輸入: amount = 3, coins = [2]
  • 輸出: 0
  • 解釋: 只用面額2的硬幣不能湊成總金額3。

示例 3:

  • 輸入: amount = 10, coins = [10]
  • 輸出: 1

注意,你可以假設(shè):

  • 0 <= amount (總金額) <= 5000
  • 1 <= coin (硬幣面額)?<= 5000
  • 硬幣種類不超過 500 種
  • 結(jié)果符合 32 位符號整數(shù)

本題可以重復(fù)放入金幣,也就是物品,因此屬于完全背包問題。轉(zhuǎn)換為背包問題就是:

  1. 確定dp數(shù)組以及下標的含義:dp[j]為湊成總金額j的貨幣組合數(shù)
  2. 確定遞推公式:dp[j] 就是所有的dp[j - coins[i]]想加的情況。dp[j]+=dp[j-coins[i]]
  3. dp數(shù)組如何初始化:當金幣總額為0的時候,就只有一種情況,不放入金幣,所以dp[0]=1
  4. 確定遍歷順序:在完全背包中,先遍歷背包或者物品都是可以的。因為純完全背包求得裝滿背包的最大價值是多少,和湊成總和的元素有沒有順序沒關(guān)系,以純完全背包是能湊成總和就行,不用管怎么湊的。但本題要求湊成總和的組合數(shù),元素之間明確要求沒有順序那么如果外層for循環(huán)遍歷物品(錢幣),內(nèi)層for遍歷背包(金錢總額)的情況,假設(shè):coins[0] = 1,coins[1] = 5。就是先把1加入計算,然后再把5加入計算,得到的方法數(shù)量只有{1, 5}這種情況。而不會出現(xiàn){5, 1}的情況。所以這種遍歷順序中dp[j]里計算的是組合數(shù)!如果把兩個for交換順序,那么背包容量的每一個值,都是經(jīng)過 1 和 5 的計算,包含了{1, 5} 和 {5, 1}兩種情況,此時計算的是排列數(shù),本題要求不重復(fù),只計算組合數(shù)即可,所以需要先遍歷物品,再遍歷背包。
class Solution {
    /**
    dp[j]為湊成總金額j的貨幣組合數(shù)
    dp[0]=1
    dp[j]+=dp[j-coins[i]]
     */
    public int change(int amount, int[] coins) {
        int[] dp= new int[amount+1];
        dp[0]=1;
        for(int i=0;i<coins.length;i++){
            for(int j=coins[i];j<=amount;j++){
                dp[j]+=dp[j-coins[i]];
            }
        }
        return dp[amount];
    }
}

377. 組合總和 Ⅳ

給定一個由正整數(shù)組成且不存在重復(fù)數(shù)字的數(shù)組,找出和為給定目標正整數(shù)的組合的個數(shù)。

示例:

  • nums = [1, 2, 3]
  • target = 4

所有可能的組合為: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)

請注意,順序不同的序列被視作不同的組合。

因此輸出為 7

本題可以重復(fù)放物品,所以為完全背包問題,思考下面五部曲:

  1. 確定dp數(shù)組以及下標的含義:dp[j]為湊成目標j的元素組合數(shù)
  2. 確定遞推公式:dp[j]+=dp[j-nums[i]]
  3. dp數(shù)組如何初始化:dp[0]=1
  4. 確定遍歷順序:題里給的示例很明確的說民反,順序不同的序列視作不同的組合,也就是{1,2}和{2,1}算兩種組合,因此這里需要計算的是排列數(shù),因此需要先遍歷背包,再遍歷物品。

本題再次強調(diào)的一點:文章來源地址http://www.zghlxwxcb.cn/news/detail-843252.html

  • 如果求組合數(shù)就是外層for循環(huán)遍歷物品,內(nèi)層for遍歷背包。
  • 如果求排列數(shù)就是外層for遍歷背包,內(nèi)層for循環(huán)遍歷物品。
class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target+1];
        dp[0]=1;
        //求排列個數(shù),需要先遍歷背包再遍歷物品
        for(int j=0;j<=target;j++){
            for(int i=0;i<nums.length;i++){
                if(j-nums[i]>=0 ) dp[j]+=dp[j-nums[i]];
            }
        }
        return dp[target];
    }
}

到了這里,關(guān)于Leetcoder Day39| 動態(tài)規(guī)劃part06 完全背包問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Day39 代碼隨想錄(1刷) 動態(tài)規(guī)劃 0-1背包

    題目描述 小明是一位科學(xué)家,他需要參加一場重要的國際科學(xué)大會,以展示自己的最新研究成果。他需要帶一些研究材料,但是他的行李箱空間有限。這些研究材料包括實驗設(shè)備、文獻資料和實驗樣本等等,它們各自占據(jù)不同的空間,并且具有不同的價值。? 小明的行李空間

    2024年04月23日
    瀏覽(32)
  • day44代碼訓(xùn)練|動態(tài)規(guī)劃part06

    day44代碼訓(xùn)練|動態(tài)規(guī)劃part06

    完全背包和01背包問題唯一不同的地方就是,每種物品有無限件 。 1. dp數(shù)組的含義 dp[i][j] 0-i物品,重量為j的容量時,最大的價值 2. 遞推公式 dp[i][j] = max(dp[i-1][j],dp[i][j-weight[i]]+value[i]); 兩種狀態(tài),不用物品i的話,直接是用dp[i-1][j] 選用物品的話,為了重復(fù)使用物品i,其實是

    2024年02月03日
    瀏覽(23)
  • 動態(tài)規(guī)劃-背包問題-完全背包

    對比01背包,完全背包中的每件物品有無數(shù)件。 也就是說,每件物品可以拿0,1,…,k,…件。 dp[i][j]表示前i種物品,體積為j時的最大價值 對于第i件物品: 不拿:dp[i][j]?dp[i-1][j] 拿一件:dp[i][j]?dp[i-1][j-w[i]]+v[i] 拿兩件:dp[i][j]?dp[i-1][j-2w[i]]+2v[i] … 拿k件:dp[i]][j]?dp[i

    2024年04月08日
    瀏覽(20)
  • 完全背包&多重背包問題(動態(tài)規(guī)劃)

    完全背包問題: 每個物品使用次數(shù)沒有限制,與0-1背包的不同之處在于 遍歷背包的順序 是正序。 多重背包問題: 與完全背包的區(qū)別在于,每一種物品是有個數(shù)限制的,不能無限選擇。這篇博客講解的非常詳細,可以參考學(xué)習(xí): 多重背包問題---超詳細講解+優(yōu)化(不懂你揍我

    2024年04月10日
    瀏覽(24)
  • 動態(tài)規(guī)劃之背包問題——完全背包

    算法相關(guān)數(shù)據(jù)結(jié)構(gòu)總結(jié): 序號 數(shù)據(jù)結(jié)構(gòu) 文章 1 動態(tài)規(guī)劃 動態(tài)規(guī)劃之背包問題——01背包 動態(tài)規(guī)劃之背包問題——完全背包 動態(tài)規(guī)劃之打家劫舍系列問題 動態(tài)規(guī)劃之股票買賣系列問題 動態(tài)規(guī)劃之子序列問題 算法(Java)——動態(tài)規(guī)劃 2 數(shù)組 算法分析之數(shù)組問題 3 鏈表 算法

    2024年02月03日
    瀏覽(27)
  • 【動態(tài)規(guī)劃之完全背包問題】完全背包問題的通用解法與優(yōu)化

    【動態(tài)規(guī)劃之完全背包問題】完全背包問題的通用解法與優(yōu)化

    ?? 前面的話 ?? 本篇文章將介紹動態(tài)規(guī)劃中的背包問題——完全背包問題,前面我們已經(jīng)介紹了0-1背包問題,其實完全背包問題就只改了0-1背包問題的一個條件,即物品可選擇次數(shù)由一次改為無數(shù)次,僅此而已,下面我們就來開始介紹完全背包問題。 ??博客主頁:未見

    2023年04月22日
    瀏覽(115)
  • Day 44 | 動態(tài)規(guī)劃 完全背包、518. 零錢兌換 II 、 377. 組合總和 Ⅳ

    Day 44 | 動態(tài)規(guī)劃 完全背包、518. 零錢兌換 II 、 377. 組合總和 Ⅳ

    題目 文章講解 視頻講解 完全背包和0-1背包的區(qū)別在于:物品是否可以重復(fù)使用 思路:對于完全背包問題,內(nèi)層循環(huán)的遍歷方式應(yīng)該是從weight[i]開始一直遍歷到V,而不是從V到weight[i]。這樣可以確保每種物品可以被選擇多次放入背包,從而求解完全背包問題。 對于完全背包問

    2024年02月20日
    瀏覽(27)
  • 動態(tài)規(guī)劃——完全背包問題

    動態(tài)規(guī)劃——完全背包問題

    由于本人實力尚淺,接觸算法沒多久,寫這篇blog僅僅是想要提升自己對算法的理解,如果各位讀者發(fā)現(xiàn)什么錯誤,懇請指正,希望和大家一起進步。(●’?’●) 了解完全背包問題前可以先去看看01背包問題(良心正解),先了解這個基礎(chǔ)問題會更有利于你了解下面的完全背

    2024年02月04日
    瀏覽(29)
  • 動態(tài)規(guī)劃:完全背包問題

    動態(tài)規(guī)劃:完全背包問題

    ACwing #3. 完全背包問題 完全背包問題和01背包問題很相似。 01背包問題每個物品只能選一個,而完全背包問題每個物品可以選無限次。 DP問題的關(guān)鍵是找到狀態(tài)轉(zhuǎn)移方程: ①定義f[i][j]表示從前 i 個物品中選擇,體積為 j 的時候的最大價值。 ②那么轉(zhuǎn)移方程f[i][j] = max(f[i - 1][j

    2023年04月19日
    瀏覽(25)
  • 算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹

    算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹

    ??\\\"Su7\\\"?? 作者:Lvzi 文章主要內(nèi)容:算法系列–動態(tài)規(guī)劃–背包問題(3)–完全背包介紹 大家好,今天為大家?guī)淼氖?算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹 鏈接: 完全背包 可以發(fā)現(xiàn)完全背包問題和01背包問題還是特比相似的 分析: 完全背包問題 是 01背包問題 的推廣

    2024年04月25日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包