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

力扣第1049題 最后一塊石頭的重量Il c++ 動(dòng)態(tài)規(guī)劃(01背包)

這篇具有很好參考價(jià)值的文章主要介紹了力扣第1049題 最后一塊石頭的重量Il c++ 動(dòng)態(tài)規(guī)劃(01背包)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

題目

1049. 最后一塊石頭的重量 II

中等

相關(guān)標(biāo)簽

有一堆石頭,用整數(shù)數(shù)組?stones?表示。其中?stones[i]?表示第?i?塊石頭的重量。

每一回合,從中選出任意兩塊石頭,然后將它們一起粉碎。假設(shè)石頭的重量分別為?x?和?y,且?x <= y。那么粉碎的可能結(jié)果如下:

  • 如果?x == y,那么兩塊石頭都會(huì)被完全粉碎;
  • 如果?x != y,那么重量為?x?的石頭將會(huì)完全粉碎,而重量為?y?的石頭新重量為?y-x。

最后,最多只會(huì)剩下一塊?石頭。返回此石頭?最小的可能重量?。如果沒有石頭剩下,就返回?0。

示例 1:

輸入:stones = [2,7,4,1,8,1]
輸出:1
解釋:
組合 2 和 4,得到 2,所以數(shù)組轉(zhuǎn)化為 [2,7,1,8,1],
組合 7 和 8,得到 1,所以數(shù)組轉(zhuǎn)化為 [2,1,1,1],
組合 2 和 1,得到 1,所以數(shù)組轉(zhuǎn)化為 [1,1,1],
組合 1 和 1,得到 0,所以數(shù)組轉(zhuǎn)化為 [1],這就是最優(yōu)值。

示例 2:

輸入:stones = [31,26,33,21,40]
輸出:5

提示:

  • 1 <= stones.length <= 30
  • 1 <= stones[i] <= 100

思路和解題方法

使用了 0-1 背包問題的思想,通過動(dòng)態(tài)規(guī)劃的方式求解。

具體思路如下:

  1. 首先,計(jì)算所有石頭的總重量?sum。
  2. 然后,將問題轉(zhuǎn)化為將石頭分成兩堆,使得兩堆的重量盡可能接近?sum/2。
  3. 創(chuàng)建一個(gè)大小為?15001?的動(dòng)態(tài)規(guī)劃數(shù)組?dp,用于記錄容量為?j?的背包所能裝載的最大重量。
  4. 使用雙重循環(huán)遍歷石頭數(shù)組?stones?和背包容量?j,進(jìn)行動(dòng)態(tài)規(guī)劃的狀態(tài)轉(zhuǎn)移。
  5. 在每次狀態(tài)轉(zhuǎn)移時(shí),比較當(dāng)前背包容量?j?能夠裝載的最大重量?dp[j]?和將當(dāng)前石頭放入背包后所能得到的重量?dp[j - stones[i]] + stones[i],取較大值更新?dp[j]。
  6. 最后,返回兩堆石頭的重量差值,即?sum - dp[target] - dp[target]。

復(fù)雜度

????????時(shí)間復(fù)雜度:

????????????????O(n*m)

????????時(shí)間復(fù)雜度為 O(n * m)。

其中 n 是石頭的數(shù)量,m 是石頭總重量的一半。這是因?yàn)榇a中使用了兩層循環(huán),外層循環(huán)遍歷石頭數(shù)組,內(nèi)層循環(huán)遍歷背包容量。對(duì)于每個(gè)背包容量,都需要進(jìn)行一次狀態(tài)轉(zhuǎn)移操作,因此總共需要進(jìn)行 n * m 次狀態(tài)轉(zhuǎn)移。

????????空間復(fù)雜度

????????????????O(m)

????????空間復(fù)雜度為 O(m)。

????????其中 m 是石頭總重量的一半。這是因?yàn)榇a中創(chuàng)建了一個(gè)大小為 15001 的動(dòng)態(tài)規(guī)劃數(shù)組 dp,用于記錄不同背包容量下的最大重量。由于背包容量的最大值為石頭總重量的一半,因此數(shù)組 dp 的大小為 m+1,即 15001。因此,所需的額外空間隨著石頭總重量的增加而增加,但是與石頭的數(shù)量無關(guān)。

需要注意的是,代碼中使用了一個(gè)固定大小的動(dòng)態(tài)規(guī)劃數(shù)組 dp,這是因?yàn)轭}目給定了石頭的最大數(shù)量為 30,每塊石頭的重量最大為 100。根據(jù)題目的限制條件,可以確定石頭總重量的上限為 3000,因此背包容量的上限為 1500。為了保證數(shù)組 dp 能夠覆蓋所有可能的背包容量,將其大小設(shè)置為 15001。如果題目的限制條件發(fā)生變化,可能需要調(diào)整數(shù)組 dp 的大小以適應(yīng)新的情況。

c++ 代碼

int lastStoneWeightII(vector<int>& stones) {
    vector<int> dp(15001, 0); // 創(chuàng)建一個(gè)大小為 15001 的動(dòng)態(tài)規(guī)劃數(shù)組 dp,初始值都為 0
    int sum = 0; // 計(jì)算所有石頭的總重量
    for (int i = 0; i < stones.size(); i++) {
        sum += stones[i];
    }
    int target = sum / 2; // 目標(biāo)是將石頭分為兩堆,使得兩堆的重量盡可能接近 sum/2

    for (int i = 0; i < stones.size(); i++) {
        for (int j = target; j >= stones[i]; j--) {
            // 動(dòng)態(tài)規(guī)劃的核心邏輯
            // dp[j] 表示容量為 j 的背包所能裝載的最大重量
            // dp[j-stones[i]]+stones[i] 表示將當(dāng)前石頭放入容量為 j 的背包中所能得到的重量
            dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
        }
    }

    return sum - dp[target] - dp[target]; // 返回兩堆石頭的重量差值
}

簡潔寫法(使用庫函數(shù)做加法)

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        vector<int> dp(15001,0);
        int sum = accumulate(stones.begin(), stones.end(), 0);
        int target = sum/2;
        for(int i = 0;i<stones.size();i++)
            for(int j = target;j>=stones[i];j--)
                dp[j] = max(dp[j],dp[j-stones[i]]+stones[i]);
        return sum - dp[target] - dp[target];
    }
};

覺得有用的話可以點(diǎn)點(diǎn)贊,支持一下。

如果愿意的話關(guān)注一下。會(huì)對(duì)你有更多的幫助。

每天都會(huì)不定時(shí)更新哦? >人<? 。文章來源地址http://www.zghlxwxcb.cn/news/detail-741268.html

到了這里,關(guān)于力扣第1049題 最后一塊石頭的重量Il c++ 動(dòng)態(tài)規(guī)劃(01背包)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(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)文章

  • Leetcode 1049 最后一塊石頭的重量II

    Leetcode 1049 最后一塊石頭的重量II

    題意理解 : ????????有一堆石頭,用整數(shù)數(shù)組? stones ?表示。其中? stones[i] ?表示第? i ?塊石頭的重量。 ????????每一回合,從中選出 任意兩塊石頭 ,然后將它們一起粉碎。假設(shè)石頭的重量分別為? x ?和? y ,且? x = y 。 ? ? ? ? 思路轉(zhuǎn)化:我們可以將題目轉(zhuǎn)換為

    2024年01月16日
    瀏覽(20)
  • LeetCode1049. 最后一塊石頭的重量 II

    一、題目 有一堆石頭,用整數(shù)數(shù)組 stones 表示。其中 stones[i] 表示第 i 塊石頭的重量。 每一回合,從中選出 任意兩塊石頭 ,然后將它們一起粉碎。假設(shè)石頭的重量分別為 x 和 y ,且 x = y 。那么粉碎的可能結(jié)果如下: 如果 x == y ,那么兩塊石頭都會(huì)被完全粉碎; 如果 x != y ,

    2024年02月10日
    瀏覽(23)
  • Leet code1049 最后一塊石頭的重量II

    1049 最后一塊石頭的重量II 【問題描述】 有一堆石頭,用整數(shù)數(shù)組 stones 表示。其中 stones[i] 表示第 i 塊石頭的重量。 每一回合,從中選出 任意兩塊石頭 ,然后將它們一起粉碎。假設(shè)石頭的重量分別為 x 和 y ,且 x = y 。那么粉碎的可能結(jié)果如下: 如果 x == y ,那么兩塊石頭

    2024年02月13日
    瀏覽(21)
  • 【LeetCode題目詳解】第九章 動(dòng)態(tài)規(guī)劃 part05 1049. 最后一塊石頭的重量 II 494. 目標(biāo)和 474.一和零(day43補(bǔ))

    【LeetCode題目詳解】第九章 動(dòng)態(tài)規(guī)劃 part05 1049. 最后一塊石頭的重量 II 494. 目標(biāo)和 474.一和零(day43補(bǔ))

    有一堆石頭,用整數(shù)數(shù)組? stones 表示。其中? stones[i] 表示第 i 塊石頭的重量。 每一回合,從中選出 任意兩塊石頭 ,然后將它們一起粉碎。假設(shè)石頭的重量分別為? x 和? y ,且? x = y 。那么粉碎的可能結(jié)果如下: 如果? x == y ,那么兩塊石頭都會(huì)被完全粉碎; 如果? x != y

    2024年02月09日
    瀏覽(25)
  • 【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)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】1049、LeetCode 最后一塊石頭的重量 II

    【算法與數(shù)據(jù)結(jié)構(gòu)】1049、LeetCode 最后一塊石頭的重量 II

    所有的LeetCode題解索引,可以看這篇文章——【算法和數(shù)據(jù)結(jié)構(gòu)】LeetCode題解。 ?? 思路分析 :本題需要得到石頭之間兩兩粉碎之后的最小值,那么一個(gè)簡單的思路就是將這堆石頭劃分成大小相近的兩小堆石頭,然后粉碎,這樣得到的結(jié)果必然是最優(yōu)值。那么如何劃分呢?我

    2024年01月21日
    瀏覽(20)
  • ( 背包問題) 1049. 最后一塊石頭的重量 II ——【Leetcode每日一題】

    ( 背包問題) 1049. 最后一塊石頭的重量 II ——【Leetcode每日一題】

    難度:中等 有一堆石頭,用整數(shù)數(shù)組 stones 表示。其中 stones[i] 表示第 i 塊石頭的重量。 每一回合,從中選出 任意兩塊石頭 ,然后將它們一起粉碎。假設(shè)石頭的重量分別為 x 和 y ,且 x = y 。那么粉碎的可能結(jié)果如下: 如果 x == y ,那么兩塊石頭都會(huì)被完全粉碎; 如果 x !=

    2024年02月08日
    瀏覽(25)
  • 代碼隨想錄Day36 動(dòng)態(tài)規(guī)劃05 LeetCode T1049最后一塊石頭的重量II T494 目標(biāo)和 T474 一和零

    代碼隨想錄Day36 動(dòng)態(tài)規(guī)劃05 LeetCode T1049最后一塊石頭的重量II T494 目標(biāo)和 T474 一和零

    理論基礎(chǔ)? :?代碼隨想錄Day34 LeetCode T343整數(shù)拆分 T96 不同的二叉搜索樹-CSDN博客 1.明白dp數(shù)組的含義 2.明白遞推公式的含義 3.初始化dp數(shù)組 4.注意dp數(shù)組的遍歷順序 5.打印dp數(shù)組排錯(cuò) 題目鏈接:1049. 最后一塊石頭的重量 II - 力扣(LeetCode) 這題我們?nèi)匀徊捎脛?dòng)規(guī)五部曲來寫,這題和

    2024年02月06日
    瀏覽(19)
  • day43 | 1049. 最后一塊石頭的重量 II、494. 目標(biāo)和、474.一和零

    目錄: 1049. 最后一塊石頭的重量 II 有一堆石頭,用整數(shù)數(shù)組? stones ?表示。其中? stones[i] ?表示第? i ?塊石頭的重量。 每一回合,從中選出 任意兩塊石頭 ,然后將它們一起粉碎。假設(shè)石頭的重量分別為? x ?和? y ,且? x = y 。那么粉碎的可能結(jié)果如下: 如果? x == y ,那

    2024年02月12日
    瀏覽(26)
  • Day43|leetcode 1049.最后一塊石頭的重量II、494.目標(biāo)和、474.一和零

    Day43|leetcode 1049.最后一塊石頭的重量II、494.目標(biāo)和、474.一和零

    題目鏈接:1049. 最后一塊石頭的重量 II - 力扣(LeetCode) 視頻鏈接:動(dòng)態(tài)規(guī)劃之背包問題,這個(gè)背包最多能裝多少?LeetCode:1049.最后一塊石頭的重量II_嗶哩嗶哩_bilibili 有一堆石頭,每塊石頭的重量都是正整數(shù)。 每一回合,從中選出任意兩塊石頭,然后將它們一起粉碎。假設(shè)

    2024年02月10日
    瀏覽(30)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包