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

【Day42】代碼隨想錄之動(dòng)態(tài)規(guī)劃0-1背包_416. 分割等和子集

這篇具有很好參考價(jià)值的文章主要介紹了【Day42】代碼隨想錄之動(dòng)態(tài)規(guī)劃0-1背包_416. 分割等和子集。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

動(dòng)態(tài)規(guī)劃理論基礎(chǔ)

動(dòng)規(guī)五部曲:
  1. 確定dp數(shù)組 下標(biāo)及dp[i] 的含義。
  2. 遞推公式:比如斐波那契數(shù)列 dp[i] = dp[i-1] + dp[i-2]。
  3. 初始化dp數(shù)組。
  4. 確定遍歷順序:從前到后or其他。
  5. 推導(dǎo)dp數(shù)組。
出現(xiàn)結(jié)果不正確:
  1. 打印dp日志和自己想的一樣:遞推公式、初始化或者遍歷順序出錯(cuò)。
  2. 打印dp日志和自己想的不一樣:代碼實(shí)現(xiàn)細(xì)節(jié)出現(xiàn)問題。

416. 分割等和子集

參考文檔:代碼隨想錄

題目:

給定一個(gè)只包含正整數(shù)的非空數(shù)組。是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。
注意: 每個(gè)數(shù)組中的元素不會超過 100 數(shù)組的大小不會超過 200

  • 示例 1:
    輸入: [1, 5, 11, 5]
    輸出: true
    解釋: 數(shù)組可以分割成 [1, 5, 5] 和 [11].
  • 示例 2:
    輸入: [1, 2, 3, 5]
    輸出: false
    解釋: 數(shù)組不能分割成兩個(gè)元素和相等的子集.
  • 提示:
    1 <= nums.length <= 200
    1 <= nums[i] <= 100

分析:
【Day42】代碼隨想錄之動(dòng)態(tài)規(guī)劃0-1背包_416. 分割等和子集,動(dòng)態(tài)規(guī)劃,算法,數(shù)據(jù)結(jié)構(gòu),leetcode,力扣,C++

dp五部曲:

  1. dp[j]含義:背包重量為i時(shí)候可以裝最大價(jià)值數(shù)。
  2. 遞推公式:dp[j] = max(dp[j], dp[j-nums[i]] + nums[i]);
  3. 初始化:vector<int> dp(total+1, 0); 不能影響dp[j]的更新,設(shè)為最小自然數(shù)0。
  4. 遍歷順序:雙重for循環(huán),先物品再背包,內(nèi)層for循環(huán)的循環(huán)體 倒序 更新dp,適應(yīng)滾動(dòng)數(shù)組,不影響之前的更新,正序因?yàn)橹挥幸粋€(gè)一維數(shù)組,所以會影響后面的更新。
  5. 打印:
    輸入: [1, 5, 11, 5]
    dp更新:
    下標(biāo)值:0,1,2,3,4,5,6,7,8,9,10,11
    初始化:0,0,0,0,0,0,0,0,0,0,0,0
    i = 0 :0,1,1,1,1,1,1,1,1,1,1,1
    i = 1 :0,1,1,1,1,5,6,6,6,6,6,6
    i = 2 :0,1,1,1,1,5,6,6,6,6,6,11
    i = 3 :0,1,1,1,1,5,6,6,6,6,10,11
    代碼:
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int total = 0;
        for(int i = 0; i < nums.size(); i++){
            total += nums[i];
        }
        if(total % 2) return false;
        total /= 2;// 背包的目標(biāo)體積
        
        vector<int> dp(total+1, 0);

        for(int i = 0; i < nums.size(); i++){//物品個(gè)數(shù)0-nums.size()-1
            for(int j = total; j >= nums[i]; j--){//背包的體積0-total
                dp[j] = max(dp[j], dp[j-nums[i]]+nums[i]); //遞推公式
            }
        }
        if(dp[total] == total) return true;
        return false;
    }
};

二維數(shù)組實(shí)現(xiàn):

  1. dp[i][j]含義:從0-i的物品中任取到重量限制為j的背包得到的最大價(jià)值數(shù)。
  2. 遞推公式:dp[i][j] = max(dp[i-1][j], dp[i-1][j-nums[i]] + nums[i]);
  3. 初始化:vector<vector<int>> dp(nums.size(), vector<int>(total+1, 0)); 第一列表示背包的重量為0時(shí)的價(jià)值為0,第一行表示在物品0存在的情況下背包不同重量的價(jià)值,滿足條件的初始化為物品0的價(jià)值,其他元素都需要之后從上和左上的二維數(shù)組元素值計(jì)算得出,所以初始化值任意。
  4. 遍歷順序:雙重for循環(huán),對于二維數(shù)組,先物品再背包或者先背包再物品,在當(dāng)前額日偽數(shù)組求最大價(jià)值的時(shí)候上和左上元素都是存在的,所以遍歷順序任意。

先物品再背包

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int total = 0;
        for(int i = 0; i < nums.size(); i++){
            total += nums[i];
        }
        if(total % 2) return false;
        total /= 2;// 背包的目標(biāo)體積
        
        //二維數(shù)組
        vector<vector<int>> dp(nums.size(), vector<int>(total+1, 0));

        for(int i = total; i >= nums[0]; i--) dp[0][i] = nums[0];

        for(int i = 1; i < nums.size(); i++){//先物品
            for(int j = 1; j <= total; j++){//再背包
                if(j < nums[i]) dp[i][j] = dp[i-1][j];
                else dp[i][j] = max(dp[i-1][j], dp[i-1][j-nums[i]]+nums[i]);
            }
        }

        if(dp[nums.size()-1][total] == total) return true;
        return false;
    }
};

先背包再物品文章來源地址http://www.zghlxwxcb.cn/news/detail-828766.html

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int total = 0;
        for(int i = 0; i < nums.size(); i++){
            total += nums[i];
        }
        if(total % 2) return false;
        total /= 2;// 背包的目標(biāo)體積
        
        //二維數(shù)組
        vector<vector<int>> dp(nums.size(), vector<int>(total+1, 0));

        for(int i = total; i >= nums[0]; i--) dp[0][i] = nums[0];

        for(int j = 1; j <= total; j++){//先背包
            for(int i = 1; i < nums.size(); i++){//再物品
                if(j < nums[i]) dp[i][j] = dp[i-1][j];
                else dp[i][j] = max(dp[i-1][j], dp[i-1][j-nums[i]]+nums[i]);
            }
        }

        if(dp[nums.size()-1][total] == total) return true;
        return false;
    }
};

到了這里,關(guān)于【Day42】代碼隨想錄之動(dòng)態(tài)規(guī)劃0-1背包_416. 分割等和子集的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【Day43】代碼隨想錄之動(dòng)態(tài)規(guī)劃0-1背包_1049. 最后一塊石頭的重量 II_494. 目標(biāo)和_ 474.一和零

    動(dòng)態(tài)規(guī)劃理論基礎(chǔ) 動(dòng)規(guī)五部曲: 確定dp數(shù)組 下標(biāo)及dp[i] 的含義。 遞推公式:比如斐波那契數(shù)列 dp[i] = dp[i-1] + dp[i-2]。 初始化dp數(shù)組。 確定遍歷順序:從前到后or其他。 打印。 出現(xiàn)結(jié)果不正確: 打印dp日志和自己想的一樣:遞推公式、初始化或者遍歷順序出錯(cuò)。 打印dp日志和

    2024年02月22日
    瀏覽(25)
  • 動(dòng)態(tài)規(guī)劃01背包問題-代碼隨想錄-刷題筆記

    動(dòng)態(tài)規(guī)劃01背包問題-代碼隨想錄-刷題筆記

    有n件物品和一個(gè)最多能背重量為w 的背包。第i件物品的重量是weight[i],得到的價(jià)值是value[i] 。 每件物品只能用一次 ,求解將哪些物品裝入背包里物品價(jià)值總和最大。 二維dp數(shù)組01背包 確定dp數(shù)組以及下標(biāo)的含義 是使用二維數(shù)組,即 dp[i][j] 表示從下標(biāo)為[0-i]的物品里任意取,

    2024年02月07日
    瀏覽(86)
  • 二刷代碼隨想錄——?jiǎng)討B(tài)規(guī)劃day40

    一個(gè)本碩雙非的小菜雞,備戰(zhàn)24年秋招,計(jì)劃二刷完卡子哥的刷題計(jì)劃,加油! 二刷決定精刷了,于是參加了卡子哥的刷題班,訓(xùn)練營為期60天,我一定能堅(jiān)持下去,迎來兩個(gè)月后的脫變的,加油! 推薦一手卡子哥的刷題網(wǎng)站,感謝卡子哥。代碼隨想錄 終于來到了守關(guān)boss。

    2024年03月11日
    瀏覽(85)
  • 代碼隨想錄Day41:動(dòng)態(tài)規(guī)劃Part3

    代碼隨想錄Day41:動(dòng)態(tài)規(guī)劃Part3

    講解前: 毫無頭緒 講解后: 這道題的動(dòng)態(tài)思路一開始很不容易想出來,雖然dp數(shù)組的定義如果知道是動(dòng)態(tài)規(guī)劃的話估摸著可以想出來那就是很straight forward dp定義:一維數(shù)組dp[i], i 代表整數(shù)的值,dp[i] 代表將整數(shù) i 拆分的話可以獲得的最大乘積 然后呢就是定義遞歸推導(dǎo)式了,

    2024年04月27日
    瀏覽(27)
  • 代碼隨想錄第44天|動(dòng)態(tài)規(guī)劃:完全背包理論基礎(chǔ) 518.零錢兌換II 377. 組合總和 Ⅳ

    代碼隨想錄第44天|動(dòng)態(tài)規(guī)劃:完全背包理論基礎(chǔ) 518.零錢兌換II 377. 組合總和 Ⅳ

    代碼隨想錄 (programmercarl.com) 動(dòng)態(tài)規(guī)劃之完全背包,裝滿背包有多少種方法?組合與排列有講究!| LeetCode:518.零錢兌換II_嗶哩嗶哩_bilibili 完全背包和01背包問題唯一不同的地方就是,每種物品有無限件 。 完全背包中的物品可以添加多次,所以要從小到大遍歷: 518. 零錢兌換

    2024年04月25日
    瀏覽(26)
  • 代碼隨想錄 day38 第九章 動(dòng)態(tài)規(guī)劃part01

    ●??理論基礎(chǔ) ●??509.?斐波那契數(shù) ●??70.?爬樓梯 ●??746.?使用最小花費(fèi)爬樓梯 理論基礎(chǔ) 解決動(dòng)態(tài)規(guī)劃必須要想清楚的點(diǎn) dp數(shù)組以及下標(biāo)的含義 遞推公式 dp數(shù)組如何初始化 遍歷順序 打印數(shù)組 檢查結(jié)果 關(guān)聯(lián) leetcode 509.?斐波那契數(shù) 思路 動(dòng)規(guī)五部曲 dp數(shù)組以及下標(biāo)的含義

    2024年04月17日
    瀏覽(30)
  • 【代碼隨想錄】Day 49 動(dòng)態(tài)規(guī)劃10 (買賣股票Ⅰ、Ⅱ)

    【代碼隨想錄】Day 49 動(dòng)態(tài)規(guī)劃10 (買賣股票Ⅰ、Ⅱ)

    https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ dp[i]表示在第i天時(shí),賣/不賣股票能獲得的最大利潤: 1、賣股票:dp[i] = prices[i] -minPrice(i天以前的最低價(jià)格) 2、不賣股票:dp[i] = dp[i-1](因?yàn)椴毁u股票,所以狀態(tài)和前一天保持一致) ∴dp[i] = max(dp[i-1], prices[i] - minPrice); https

    2024年02月09日
    瀏覽(18)
  • 【Day52】代碼隨想錄之動(dòng)態(tài)規(guī)劃_打家劫舍

    動(dòng)態(tài)規(guī)劃理論基礎(chǔ) 動(dòng)規(guī)五部曲: 確定dp數(shù)組 下標(biāo)及dp[i] 的含義。 遞推公式:比如斐波那契數(shù)列 dp[i] = dp[i-1] + dp[i-2]。 初始化dp數(shù)組。 確定遍歷順序:從前到后or其他。 打印。 出現(xiàn)結(jié)果不正確: 打印dp日志和自己想的一樣:遞推公式、初始化或者遍歷順序出錯(cuò)。 打印dp日志和

    2024年02月22日
    瀏覽(28)
  • 【隨想錄學(xué)習(xí)】——第十章 動(dòng)態(tài)規(guī)劃(0-1背包+完全背包)

    【隨想錄學(xué)習(xí)】——第十章 動(dòng)態(tài)規(guī)劃(0-1背包+完全背包)

    動(dòng)態(tài)規(guī)劃,英文:Dynamic Programming,簡稱DP,如果某一問題有很多重疊子問題,使用動(dòng)態(tài)規(guī)劃是最有效的。 所以動(dòng)態(tài)規(guī)劃中每一個(gè)狀態(tài)一定是由上一個(gè)狀態(tài)推導(dǎo)出來的, 這一點(diǎn)就區(qū)分于貪心 ,貪心沒有狀態(tài)推導(dǎo),而是從局部直接選最優(yōu)的, dp數(shù)組表示斐波那契數(shù)列,dp[i]表示

    2024年01月19日
    瀏覽(29)
  • 代碼隨想錄 day44 完全背包

    class?Solution?{ public: ????int?change(int?amount,?vectorint?coins)?{ ????????vector?int?dp(amount+1,0); ????????dp[0]=1; ????????for(int?i=0;icoins.size();i++){ ????????????for(int?j=coins[i];j=amount;j++){ ????????????????dp[j]+=dp[j-coins[i]]; ????????????} ????????} ?

    2024年02月15日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包