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

Leetcode動(dòng)態(tài)規(guī)劃篇(0-1背包問題一維和二維dp實(shí)現(xiàn))

這篇具有很好參考價(jià)值的文章主要介紹了Leetcode動(dòng)態(tài)規(guī)劃篇(0-1背包問題一維和二維dp實(shí)現(xiàn))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??專欄:每日算法學(xué)習(xí)
??個(gè)人主頁:個(gè)人主頁

Leetcode動(dòng)態(tài)規(guī)劃篇(0-1背包問題一維和二維dp實(shí)現(xiàn))


1.前提:什么是0-1背包

??情況描述:有n件物品和一個(gè)最多能背重量為w 的背包。第i件物品的重量是weight[i],得到的價(jià)值是value[i] 。每件物品只能用一次,求解將哪些物品裝入背包里物品價(jià)值總和最大。每一件物品其實(shí)只有兩個(gè)狀態(tài),取或者不取。
舉一個(gè)例子,之后我們將拿這里例子進(jìn)行后續(xù)分析
weight = []1,3,4]
value = [15,20,30]

物品 weight value
物品0 1 15
物品1 3 20
物品2 4 30

2.實(shí)現(xiàn):二維dp講解

??動(dòng)態(tài)規(guī)劃五部曲:
1.(重要)首先搞懂dp[i][j]代表的意思: 代表從0-i個(gè)物品中,取出任意個(gè),放入容量為j的背包的價(jià)值總和。i表示取的物品,j表示背包容量
2.確定遞推公式:
分為兩個(gè)方向思考價(jià)值:一個(gè)是不放i物品,一個(gè)是放了i物品。
如果容量不滿足:直接將上一個(gè)背包價(jià)值賦值給dp[i][j]
如果容量滿足:
不放i物品價(jià)值,那么dp[i][j]就是未放i物品的價(jià)值,即dp[i-1][j]
放了i物品價(jià)值,那么此時(shí)最大價(jià)值:dp[i][j]應(yīng)該是dp[i-1][j-weight[i]+value[i]]
兩者取最大值比較即可
遞推公式為:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
3.初始化dp數(shù)組:
如下圖所示:
當(dāng)背包容量為0的時(shí)候,所有價(jià)值為0;當(dāng)i=0時(shí),只有一個(gè)物品可供選擇,所以物品0行值為15;之后當(dāng)選擇多起來之后,可以根據(jù)遞推公式得出此時(shí)物品的價(jià)值。所以初始化dp[i][0]和dp[0][j]即可滿足初始化條件,供我們后續(xù)計(jì)算物品價(jià)值。同時(shí)對(duì)于其他值,我們給初始化成0,這樣我們?cè)诤罄m(xù)進(jìn)行求最大值的時(shí)候不會(huì)對(duì)我們產(chǎn)生影響

背包種類/背包容量 0 1 2 3 4
物品0 0 15 15 15 15
物品1 0 0 0 0 0
物品2 0 0 0 0 0

代碼實(shí)現(xiàn):

   // 創(chuàng)建dp數(shù)組
        int goods = weight.length;  // 獲取物品的數(shù)量
        //這里數(shù)組容量為什么要+1呢?
        //因?yàn)槲覀冇痔砑恿艘粋€(gè)0,容量變成了5,此時(shí)size才為4,求n的時(shí)候,保證不越界,使求的n就是dp[i][n],加一保證不越界和好使用
        int[][] dp = new int[goods][bagSize + 1];

        // 初始化dp數(shù)組
        // 創(chuàng)建數(shù)組后,其中默認(rèn)的值就是0
        //為什么這里是以weight[0]作為其實(shí)值呢?,當(dāng)只有一個(gè)物品時(shí)候,
        //要從容量符合的位置開始裝,初始化第一行價(jià)值
        for (int j = weight[0]; j <= bagSize; j++) {
            dp[0][j] = value[0];
        }

4.確定遍歷順序: 因?yàn)閐p數(shù)組需要知道之前的物品價(jià)值,才能求得價(jià)值最大值,所以遍歷順序是從前向后。

5.舉例推導(dǎo): 就以我們上面的例子來進(jìn)行推導(dǎo):
代碼實(shí)現(xiàn):二維dp模板

package excrise.算法專訓(xùn).背包問題;

public class 背包問題0_1 {
    public static void main(String[] args) {
        int[] weight = {1,3,4};
        int[] value = {15,20,30};
        int bagSize = 4;
        testWeightBagProblem(weight,value,bagSize);
    }

    /**
     * 動(dòng)態(tài)規(guī)劃獲得結(jié)果
     * @param weight  物品的重量
     * @param value   物品的價(jià)值
     * @param bagSize 背包的容量
     */
    public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){

        // 創(chuàng)建dp數(shù)組
        int goods = weight.length;  // 獲取物品的數(shù)量
        int[][] dp = new int[goods][bagSize + 1];

        // 初始化dp數(shù)組
        // 創(chuàng)建數(shù)組后,其中默認(rèn)的值就是0
        for (int j = weight[0]; j <= bagSize; j++) {
            dp[0][j] = value[0];
        }

        // 填充dp數(shù)組
        for (int i = 1; i < weight.length; i++) {
            for (int j = 1; j <= bagSize; j++) {
                if (j < weight[i]) {
                    /**
                     * 當(dāng)前背包的容量都沒有當(dāng)前物品i大的時(shí)候,是不放物品i的
                     * 那么前i-1個(gè)物品能放下的最大價(jià)值就是當(dāng)前情況的最大價(jià)值
                     */
                    dp[i][j] = dp[i-1][j];
                } else {
                    /**
                     * 當(dāng)前背包的容量可以放下物品i
                     * 那么此時(shí)分兩種情況:
                     *    1、不放物品i
                     *    2、放物品i
                     * 比較這兩種情況下,哪種背包中物品的最大價(jià)值最大
                     */
                    dp[i][j] = Math.max(dp[i-1][j] , dp[i-1][j-weight[i]] + value[i]);
                }
            }
        }

        // 打印dp數(shù)組
        for (int i = 0; i < goods; i++) {
            for (int j = 0; j <= bagSize; j++) {
                System.out.print(dp[i][j] + "\t");
            }
            System.out.println("\n");
        }
    }
}

總結(jié): 對(duì)于背包求價(jià)值那塊,兩層for循環(huán)換位置當(dāng)你有些迷糊時(shí),要時(shí)刻去回顧dp[i][j]代表的含義是什么,慢慢才能理解進(jìn)去。

3.實(shí)現(xiàn):一維dp講解(滾動(dòng)數(shù)組)

相對(duì)于二維dp,我們更加常用一維dp來解決背包問題。
1.理解dp{j】的含義: 相對(duì)于二維dp[i][j],一維dp[j]中的j表示的是二維數(shù)組中的背包容量j,dp[j]表示此時(shí)背包的最大價(jià)值
2.確定地推公式
分為兩個(gè)方向思考價(jià)值:一個(gè)是不放i物品,一個(gè)是放了i物品。
如果容量不滿足:直接將上一個(gè)背包價(jià)值賦值給dp[j]
如果容量滿足:
不放i物品價(jià)值,那么dp[i][j]就是未放i物品的價(jià)值,即dp[j] (dp[j]是滾動(dòng)更新的,所以可以寫成dp[j])
放了i物品價(jià)值,那么此時(shí)最大價(jià)值:dp[j]應(yīng)該是dp[j-weight[i]+value[i]]
兩者取最大值比較即可
遞推公式為:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); 滾動(dòng)更新
3.初始化dp數(shù)組
數(shù)組初始化為0,即定義之后就會(huì)默認(rèn)為0;原因在第四步講解
4.遍歷順序
因?yàn)轭}中要求的是,每個(gè)物品只能使用一次。如果從前向后計(jì)算的話,那么同一個(gè)物品會(huì)被使用多次,即放了多次。所以對(duì)于一維數(shù)組來說,只能從后往前進(jìn)行計(jì)算。這樣才滿足同一個(gè)物品使用一次的條件。從后往前的話,因?yàn)槊總€(gè)物品的值初始化時(shí)0,所以保證了只使用一次。
5.舉例推導(dǎo):
依舊使用上面的例子:

背包種類/背包容量 0 1 2 3 4
物品0 0 15 15 15 15
物品1 0 0 0 0 0
物品2 0 0 0 0 0

代碼實(shí)現(xiàn):

package excrise.算法專訓(xùn).背包問題;

public class 背包問題0_1一維數(shù)組 {
    public static void main(String[] args) {
        int[] weight = {1, 3, 4};
        int[] value = {15, 20, 30};
        int bagWight = 4;
        test(weight, value, bagWight);
    }

    public static void test(int[] weight, int[] value, int bagWeight){
        int wLen = weight.length;
        //定義dp數(shù)組:dp[j]表示背包容量為j時(shí),能獲得的最大價(jià)值
        int[] dp = new int[bagWeight + 1];
        //遍歷順序:先遍歷物品,再遍歷背包容量
        for (int i = 0; i < wLen; i++){
            for (int j = bagWeight; j >= weight[i]; j--){
                dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
            }
        }
        //打印dp數(shù)組
        for (int j = 0; j <= bagWeight; j++){
            System.out.print(dp[j] + " ");
        }
    }
}

感謝您的閱讀,如果對(duì)您學(xué)習(xí)有幫助,給個(gè)一鍵三連吧!關(guān)注我,每日更新算法學(xué)習(xí)內(nèi)容。文章來源地址http://www.zghlxwxcb.cn/news/detail-407394.html

到了這里,關(guān)于Leetcode動(dòng)態(tài)規(guī)劃篇(0-1背包問題一維和二維dp實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 動(dòng)態(tài)規(guī)劃(DP)---背包二維圖

    狀態(tài)方程:dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - w[i]] + v[i]) 應(yīng)該是看完我寫的DP文章來的吧,如果沒有看到,希望看看DP那個(gè)文章結(jié)合這個(gè)理解,DP那個(gè)文章內(nèi)部寫了我對(duì)于01背包類型的想法與思路,有時(shí)間的網(wǎng)友可以了解hhh。 分析這個(gè)東東的時(shí)候,其實(shí)是四個(gè)方向嘛,我推薦要是

    2024年02月03日
    瀏覽(22)
  • 動(dòng)態(tài)規(guī)劃(DP)---- 01背包入門詳解----二維圖是學(xué)會(huì)的關(guān)鍵

    ? ? 動(dòng)態(tài)規(guī)劃,Dynamic Programing(簡(jiǎn)稱DP),個(gè)人認(rèn)為是一種 算法思想 , 用來解決多階段多層次的選擇問題,把一個(gè)復(fù)雜的問題分解成每個(gè)小塊的子問題然后一個(gè)個(gè)解決來找到最優(yōu)解。 ? ? DP適用 重疊子問題 和 最優(yōu)子結(jié)構(gòu)的性質(zhì) 的問題。 ? ? DP問題范圍分為 線性與非線性

    2024年02月03日
    瀏覽(20)
  • 動(dòng)態(tài)規(guī)劃DP之背包問題3---多重背包問題

    動(dòng)態(tài)規(guī)劃DP之背包問題3---多重背包問題

    目錄 DP分析: 優(yōu)化: ?二進(jìn)制優(yōu)化 例題: ? ? ? ? 01背包是每個(gè)物品只有一個(gè),完全背包問題是每個(gè)物品有無限個(gè)。 ? ? ? ? 那么多重背包問題就是 每個(gè)物品有有限個(gè) 。 有?N?種物品和一個(gè)容量是?V?的背包。 第?i?種物品最多有?si?件,每件體積是?vi,價(jià)值是?wi。 求解

    2024年03月20日
    瀏覽(43)
  • C++ DP算法,動(dòng)態(tài)規(guī)劃——背包問題(背包九講)

    有N件物品和一個(gè)容量為 V V V 的背包。放入第i件物品耗費(fèi)的空間是 C i C_i C i ? ,得到的價(jià)值是 W i W_i W i ? 。 求解將哪些物品裝入背包可使價(jià)值總和最大。 這是最基礎(chǔ)的背包問題,特點(diǎn)是:每種物品僅有一件,可以選擇放或不放。 用子問題定義狀態(tài):即 F [ i , v ] F[i, v] F

    2024年02月16日
    瀏覽(30)
  • 算法第十五期——?jiǎng)討B(tài)規(guī)劃(DP)之各種背包問題

    目錄 0、背包問題分類 1、?0/1背包簡(jiǎn)化版 【代碼】 2、0/ 1背包的方案數(shù) 【思路】

    2023年04月09日
    瀏覽(26)
  • leetcode-動(dòng)態(tài)規(guī)劃【背包問題】

    leetcode-動(dòng)態(tài)規(guī)劃【背包問題】

    基礎(chǔ)背包: 416. 分割等和子集 1049. 最后一塊石頭的重量ii 494. 目標(biāo)和 474. 一和零 完全背包: 518. 零錢兌換ii 377. 組合總和iv 70. 爬樓梯 322. 零錢兌換 279. 完全平方數(shù) 139. 單詞拆分 多重背包: n件物品和最大承受重量為w的背包,其中第i件物品的重量是weight[i],得到的價(jià)值是val

    2023年04月08日
    瀏覽(15)
  • 動(dòng)態(tài)規(guī)劃(一)一維DP

    通過上篇文章,動(dòng)態(tài)規(guī)劃(零)入門概念相信大家已經(jīng)對(duì)動(dòng)態(tài)規(guī)劃有了一些概念上的理解,那么如何運(yùn)用動(dòng)態(tài)規(guī)劃去解決問題呢,首先要知道動(dòng)態(tài)規(guī)劃的解題步驟。 動(dòng)態(tài)規(guī)劃的步驟如下: (1) 設(shè)計(jì)狀態(tài) (2) 寫出狀態(tài)轉(zhuǎn)移方程 (3) 設(shè)定初始狀態(tài) (4) 執(zhí)行狀態(tài)轉(zhuǎn)移 (5) 返回最終的解 下

    2024年02月07日
    瀏覽(22)
  • LeetCode練習(xí)八:動(dòng)態(tài)規(guī)劃下:背包問題

    LeetCode練習(xí)八:動(dòng)態(tài)規(guī)劃下:背包問題

    參考: 【資料】算法通關(guān)手冊(cè)、背包九講 - 崔添翼 【文章】背包 DP - OI Wiki 【B站視頻】代碼隨想錄詳解0-1背包 ?? 背包問題 :背包問題是線性 DP 問題中一類經(jīng)典而又特殊的模型。背包問題可以描述為:給定一組物品,每種物品都有自己的重量、價(jià)格以及數(shù)量。再給定一個(gè)

    2024年01月16日
    瀏覽(21)
  • 【動(dòng)態(tài)規(guī)劃】LeetCode 312. 戳氣球 --區(qū)間DP問題

    【動(dòng)態(tài)規(guī)劃】LeetCode 312. 戳氣球 --區(qū)間DP問題

    ? Halo,這里是Ppeua。平時(shí)主要更新C語言,C++,數(shù)據(jù)結(jié)構(gòu)算法......感興趣就關(guān)注我吧!你定不會(huì)失望。 ??個(gè)人主頁:主頁鏈接 ??算法專欄:專欄鏈接 ????? 我會(huì)一直往里填充內(nèi)容噠! ??LeetCode專欄:專欄鏈接? ???? 目前在刷初級(jí)算法的LeetBook 。若每日一題當(dāng)中有力所能

    2023年04月16日
    瀏覽(18)
  • 【LeetCode動(dòng)態(tài)規(guī)劃#08】完全背包問題實(shí)戰(zhàn)與分析(零錢兌換II)

    力扣題目鏈接(opens new window) 給定不同面額的硬幣和一個(gè)總金額。寫出函數(shù)來計(jì)算可以湊成總金額的硬幣組合數(shù)。假設(shè)每一種面額的硬幣有無限個(gè)。 示例 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

    2023年04月19日
    瀏覽(47)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包