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

代碼隨想錄 Day35 動態(tài)規(guī)劃04 01背包問題和完全背包問題 LeetCode T416 分割等和子集

這篇具有很好參考價值的文章主要介紹了代碼隨想錄 Day35 動態(tài)規(guī)劃04 01背包問題和完全背包問題 LeetCode T416 分割等和子集。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背包問題

代碼隨想錄 Day35 動態(tài)規(guī)劃04 01背包問題和完全背包問題 LeetCode T416 分割等和子集,數(shù)據(jù)結(jié)構(gòu),代碼隨想錄,動態(tài)規(guī)劃,leetcode,算法

說到背包問題大家都會想到使用動規(guī)的方式來求解,那么為什么用動規(guī)呢,dp數(shù)組代表什么呢?初始化是什么,遍歷方式又是什么,這篇文章筆者將詳細講解背包問題的經(jīng)典例題0-1背包問題和完全背包問題的解題方式,希望能幫助到大家

1.暴力方式

有人一提到背包問題就只會使用動態(tài)規(guī)劃來做,那么背包問題假如讓你使用暴力求解該如何解決呢?我們以0-1背包為例,每個物品是不是只有兩種狀態(tài)?放或者不放,我們可以遍歷所有方式,使用回溯來解決問題.

0-1背包問題解決方式(二維數(shù)組)

動規(guī)五部曲

1.明白dp數(shù)組的含義

此處dp[i][j]表示的就是從[0,i]個物品中任選,用容量為j的背包能裝的最大價值.

代碼隨想錄 Day35 動態(tài)規(guī)劃04 01背包問題和完全背包問題 LeetCode T416 分割等和子集,數(shù)據(jù)結(jié)構(gòu),代碼隨想錄,動態(tài)規(guī)劃,leetcode,算法

2.數(shù)組的初始化和遞推公式的理解

遞推公式:

不放物品:其實就是延續(xù)上一層的最大價值即可

dp[i][j] = dp[i-1][j]

放入物品:取上一層的數(shù)據(jù)或者放入這一層的物品加上剩下的容量的最大價值,兩者之間取最大值即可

dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])

初始化數(shù)組:

首先從定義出發(fā)dp[i][0]一定得初始化為0,0容量的背包裝不了東西

由于每一行的數(shù)據(jù)都是由上一行推導(dǎo)產(chǎn)生的,所以第一行的數(shù)據(jù)我們也要進行初始化,i從weight[0]開始初始化就行,因為背包的容量的大于等于第一個物品的容量才能裝的進去它.

3.遍歷順序的理解

這里我們可以感受一下先遍歷背包和先遍歷物品的區(qū)別,其實都可以達到我們的效果,但是先

遍歷物品更好理解

那么為什么兩種遍歷方式都可以解決問題呢?

如下圖所示,因為無論是哪種遍歷方式,我們的dp[i][j]都是由左上角的元素推導(dǎo)出來的,所以無所謂用哪種遍歷順序都可以.

代碼隨想錄 Day35 動態(tài)規(guī)劃04 01背包問題和完全背包問題 LeetCode T416 分割等和子集,數(shù)據(jù)結(jié)構(gòu),代碼隨想錄,動態(tài)規(guī)劃,leetcode,算法

 for(int i = 1;i<goods;i++){
            for (int j = 1; j <= bagSize; j++) {
                if(j<weight[i]){
                    dp[i][j] = dp[i-1][j];
                }else{
                    dp[i][j] = Math.max(dp[i-1][j],value[i]+dp[i-1][j-weight[i]]);
                }
            }
        }

4.打印數(shù)組進行查看

0-1背包示例代碼

    public static void func1(int[] weight, int[] value, int bagSize){

        //初始化dp數(shù)組
        int goods = weight.length;
        int[][] dp = new  int[goods][bagSize+1];
        for (int i = weight[0]; i <=bagSize; i++) {
            dp[0][i] = value[0];
        }
        for(int i = 1;i<goods;i++){
            for (int j = 1; j <= bagSize; j++) {
                if(j<weight[i]){
                    dp[i][j] = dp[i-1][j];
                }else{
                    dp[i][j] = Math.max(dp[i-1][j],value[i]+dp[i-1][j-weight[i]]);
                }
            }
        }
        for (int i = 0; i < goods; i++) {
            for (int j = 0; j <=bagSize; j++) {
                System.out.print(dp[i][j]+" ");
            }
            System.out.println();
        }




    }












//main方法中代碼
        int[] value = {15,20,30};
        int[] weight = {1,3,4};
        int bagSize = 4;
        func1(weight,value,bagSize);

0-1背包問題解決方式(一維數(shù)組)

1.明白dp數(shù)組的含義

這里使用一維數(shù)組滾動覆蓋來代替二維數(shù)組,就類似于將一個矩陣壓成了一行

我們先回顧一下二維數(shù)組的含義dp[i][j]:從[0,i]的物品中,背包容量為j能裝的最大價值

這里的dp[j]就是背包容量為j能裝的最大價值

其實可以發(fā)現(xiàn)如果把dp[i - 1]那一層拷貝到dp[i]上,表達式完全可以是:dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i]);

2.遞推公式的理解

我們知道dp[j]可以通過dp[j - weight[i]]推導(dǎo)出來,dp[j - weight[i]]表示容量為j - weight[i]的背包所背的最大價值。

然后遞推公式由兩個選擇,一個是上一層的值和本層的物品價值加上剩余空間價值的較大值

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

3.數(shù)組的初始化

根據(jù)上面的遞推公式,我們知道初始化一定不能初始化成一個大值,因為可能太大了而導(dǎo)致后面的dp[j-weight[i]]+value[i]無法覆蓋他的值,所以我們初始化為0即可

4.遍歷順序的理解

我們先上代碼,后講解原因

我們發(fā)現(xiàn)這里的背包遍歷是從后向前遍歷的,為什么呢,舉個例子

如果是從前向后遍歷

那么dp[1] = dp[1-1]+value[0] = 15

dp[2] = dp[2-1] +value[0]= 30

這不符合我們0-1背包的每件物品只能使用一次的邏輯,因為這里物品1被放入了兩次

而我們從后向前遍歷就可以避免這個問題

dp[4] = dp[3]+value[0];

dp[3] = dp[2]+value[0];

...這里就不會存在重復(fù)計算問題

為什么上面二維數(shù)組的遍歷不需要倒序呢?

因為二維數(shù)組的dp[i][j]是由上一層的元素推導(dǎo)出來,不會影響本層的元素

以為數(shù)組的遍歷順序只能是先遍歷物品,再遍歷背包!!!

我們還是舉個例子來說明(一維數(shù)組,我們以二維數(shù)組的形式畫出來),我們就會發(fā)現(xiàn),如果用容量來遍歷物品的話,其實就是每個容量的背包只取得了一個物品,與答案相悖

代碼隨想錄 Day35 動態(tài)規(guī)劃04 01背包問題和完全背包問題 LeetCode T416 分割等和子集,數(shù)據(jù)結(jié)構(gòu),代碼隨想錄,動態(tài)規(guī)劃,leetcode,算法

for(int i = 0; i < weight.size(); i++) { // 遍歷物品
    for(int j = bagWeight; j >= weight[i]; j--) { // 遍歷背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

    }
}

5.打印數(shù)組進行查看

示例代碼?

   public static void func2(int[] weight, int[] value, int bagWeight) {
        int wLen = weight.length;
        //定義dp數(shù)組:dp[j]表示背包容量為j時,能獲得的最大價值
        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] + " ");
        }
    }
}

LeetCode T416 等和子集問題

題目鏈接:416. 分割等和子集 - 力扣(LeetCode)

題目思路:

利用上述思路,這里的背包容量是數(shù)組之和的一半,重量和價值數(shù)組都等于源數(shù)組,上面給出一定的剪枝,假如出現(xiàn)奇數(shù)就直接返回false,出現(xiàn)只有一個元素也直接返回false,下面我給出解題代碼.

題目代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-740550.html

class Solution {
    public boolean canPartition(int[] nums) {
        if(nums.length == 1){
            return false;
        }
        int sum = 0;
        for(int i:nums){
            sum += i;
        }
        if(sum % 2 == 1){
            return false;
        }
        int bagSize = sum/2;
        int[] dp = new int[bagSize+1];
        //初始化均為0
        for(int i = 0;i<nums.length;i++){
            for(int j = bagSize;j>=nums[i];j--){
                dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);
            }
        }
        if(dp[bagSize] == bagSize){
            return true;
        }
       return false;

    }
}

到了這里,關(guān)于代碼隨想錄 Day35 動態(tài)規(guī)劃04 01背包問題和完全背包問題 LeetCode T416 分割等和子集的文章就介紹完了。如果您還想了解更多內(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)文章

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

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

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

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

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

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

    2024年02月09日
    瀏覽(18)
  • Day39 代碼隨想錄(1刷) 動態(tài)規(guī)劃 0-1背包

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

    2024年04月23日
    瀏覽(32)
  • 【Day52】代碼隨想錄之動態(tài)規(guī)劃_打家劫舍

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

    2024年02月22日
    瀏覽(28)
  • 【隨想錄】Day35—第八章 貪心算法 part04

    【隨想錄】Day35—第八章 貪心算法 part04

    題目鏈接:435. 無重疊區(qū)間 貪心思路 : 正向遍歷數(shù)組,利用哈希表存儲三個面額的錢的個數(shù) ? 檸檬水找零 ——題解思路 題目鏈接:406. 根據(jù)身高重建隊列 貪心思路 : 1. 身高降序排 :先根據(jù)身高進行降序排序,若身高相同,則 根據(jù) 前面有多少人升序排。 2. 按照排序位置

    2024年04月27日
    瀏覽(95)
  • 【代碼隨想錄】刷題Day35

    860. 檸檬水找零 1.如果第一個顧客沒有五元,那么直接返回false,因為店主開始沒有零錢 2.定義兩個int,一個記錄5元,一個記錄10元,隨后遍歷整個數(shù)組,會出現(xiàn)三種情況: 如果顧客給5元,直接num5加一 如果顧客給10元,判斷num5是否大于0,大于則num5--,num10++;反之返回false

    2024年02月06日
    瀏覽(22)
  • 代碼隨想錄二刷day35

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

    2024年02月07日
    瀏覽(89)
  • 【Day42】代碼隨想錄之動態(tài)規(guī)劃0-1背包_416. 分割等和子集

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

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

    2024年02月20日
    瀏覽(97)
  • 【Day45】代碼隨想錄之動態(tài)規(guī)劃part7—爬樓梯(進階)、零錢兌換、完全平方數(shù)

    【Day45】代碼隨想錄之動態(tài)規(guī)劃part7—爬樓梯(進階)、零錢兌換、完全平方數(shù)

    今天又是補打卡的一天,開沖?。?! 今日任務(wù): 70.爬樓梯(進階) 322.零錢兌換 279.完全平方數(shù) 這道題之前做過一次,但是可以采用完全背包的問題來分析一遍。 卡瑪網(wǎng)題目:【57.爬樓梯】 這個題目其實是更難了一點,因為前面的題目都是每次要不爬1階樓梯,要不爬2階樓

    2024年03月25日
    瀏覽(32)
  • 我在代碼隨想錄|寫代碼Day33 | 動態(tài)規(guī)劃| 路徑問題| 62.不同路徑,63. 不同路徑 II,343. 整數(shù)拆分

    我在代碼隨想錄|寫代碼Day33 | 動態(tài)規(guī)劃| 路徑問題| 62.不同路徑,63. 不同路徑 II,343. 整數(shù)拆分

    ??博客介紹`: 27dCnc ??系列專欄: 數(shù)據(jù)結(jié)構(gòu)與算法 算法入門 C++項目 ?? 當前專欄: 算法入門 專題 : 數(shù)據(jù)結(jié)構(gòu)幫助小白快速入門算法 ???????????????????????? ☆*: .?. o(≧▽≦)o .?.:*☆ ??感謝大家點贊??收藏?評論?? 今日學習打卡 代碼隨想錄 - 動態(tài)規(guī)劃

    2024年03月11日
    瀏覽(96)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包