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

01背包問題-遞推公式的自我理解與LeetCode 416. 分割等和子集

這篇具有很好參考價值的文章主要介紹了01背包問題-遞推公式的自我理解與LeetCode 416. 分割等和子集。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

學(xué)算法好痛苦,完全是對我智力的一次次折磨,看了好多博客,對二維dp數(shù)組的理解都是直接搬了代碼隨想錄,搬了隨想錄又沒詳細解釋,大家都是一眼看懂的嗎,好吧()

一、對二維dp數(shù)組的理解

背景

  1. 如果有一個容量為j的這樣的背包——一個獨立的,容量為j的背包。(沒把它理解為“剩余容量”)
  2. 對于這個背包,可以從編號為0至i的物品里任意挑,挑幾個無所謂,挑多重的無所謂
  3. 計算第二步挑選的價值,取所有挑選中使整個背包價值最大的這次挑選,將最大的價值記為dp[i][j]
  4. 根據(jù)前三步,整體的dp[n][m]就是一個n+1行、m+1列的表格。取其中的一格看,比如第i行第j列的dp[i][j],它的含義為:對于容量為j的背包,編號0-i的物品隨便挑,背包最大價值為多少。下面,我們詳細說一下dp[i][j]的遞推公式。

dp[i][j]的推導(dǎo)

  1. dp[i][j]的推導(dǎo)看起來很難,因為要對i+1個物品每個物品0~i都選擇放或者不放,那么就 2 i + 1 2^{i+1} 2i+1次挑選
  2. 但是實際情況下,求dp[i][j]只需要考慮第i個物品的放與不放,也就是對于這個格子只要考慮對于1個物品的2次挑選方式(選與不選)+1次查表(查表——我們遍歷表格dp[n][m]的時候已經(jīng)填寫了在dp[i][j]之前的格子,之前的最優(yōu)挑選查找表格即可。)
  3. 為什么可以通過1次查表簡化前 2 i 2^i 2i次挑選?
  • 首先,不考慮背包容量,如果我們需要dp[i][j]是價值最大的,那么可以分兩種情況:在第三步選定“這次挑選”的時候,dp[i][j]【情況1:使整個背包價值最大的這次挑選含第i個物品】,【情況2:使整個背包價值最大的這次挑選不含第i個物品】,那么合起來
dp[i][j]=max{含第i個物品的挑選的背包價值,不含第i個物品的挑選的背包價值}
  • 其次,再考慮上背包容量,
    ①含第i個物品的挑選的背包價值:由于第i個物品占一定的容量,此時需要調(diào)整第0到第i-1個物品的挑選方式。因為需要預(yù)留第i個物品的容量,所以對于第0到第i-1個物品,最多只能j-weight[i]的容量,價值為查表得到的dp[i-1][j-weight[i]];對于第i個物品,確定是放,所以再加上它本身的價值value[i]。
    ②不含第i個物品的挑選的背包價值:與dp[i-1][j]相同。因為這種情況等于是從容量為j的背包里選,但只從第0到第i-1個物品里挑。
dp[i][j]
=max{含第i個物品的挑選的背包價值,同樣大小的背包不含第i個物品的挑選}
=max{dp[i-1][j],dp[i-1][j-weight[i]]+value[i]}

01背包問題-遞推公式的自我理解與LeetCode 416. 分割等和子集
備注:①中還需要判斷 j 是否小于 weight[i],不然j-weight[i]就變成負值,無法成為數(shù)組下標(biāo)。

二、優(yōu)化:滾動一維數(shù)組

如不考慮中間狀態(tài),可優(yōu)化空間復(fù)雜度,僅使用j+1個空間,而非(i+1)*(j+1)個。
01背包問題-遞推公式的自我理解與LeetCode 416. 分割等和子集
需要逆序(遍歷 j 時),以保證從后往前的時候前面的初始化是沒動的,不然dp[j-weight[i]]的計算會用到前面已經(jīng)加過value[i]的元素,從而再加一個。這個看代碼隨想錄手動推一遍還是比較簡單,故不細說。

例1 LeetCode 416. 分割等和子集

由于看了之前的0-1背包,被困住了思路,老是覺得0-1背包是求的一堆元素的“最大值”,而等和子集求的是一堆元素等于某個值的情況,思想上感覺不一樣。知道回溯法不配合剪枝肯定不行(200個num, 2 200 2^{200} 2200
然后隔了一天看了別人沒學(xué)代碼隨想錄的題解,發(fā)現(xiàn)其實很簡單,因為我誤認(rèn)為我這里的dp[][]里存放的是和,或者一個特定的值什么的,其實不是,就是單純的布爾變量,1,或者0。dp[i][j]代表:i個元素,任意選擇是否"可"為j?可->1,不可->0,就這么簡單。

class Solution {
public:
    bool canPartition(vector<int>& nums) 
    {
           //元素和相等——>數(shù)字集合的和等于1/2 sum
        if (accumulate(nums.begin(), nums.end(), 0) % 2 != 0 || nums.size() == 1)
            return 0;

        int target = accumulate(nums.begin(), nums.end(), 0) / 2;
        vector <vector<int>> dp(nums.size(), vector<int>(target + 1,0));
        //vector<vector<int>> vec(row, vector<int> (col,0)); -- 用 0 來初始化二維vector

        for (int i = 0; i < nums.size(); ++i) {
            dp[i][0] = 1;//均有方法可使得和為0
        }

        for (int j = 1; j <= target; ++j) {
            dp[0][j] = (j == nums[0]);
        }
        for (int i = 1; i < nums.size(); ++i)
        {
            for (int j = 1; j <= target; ++j)
            {
                dp[i][j] = dp[i - 1][j];
                if (j - nums[i] >= 0)
                    dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]];
            }
            if (dp[i][target] == 1) 
                return 1;
        }
        return 0;
    }
};

notes

第一,vector二維數(shù)組的初始化問題。如果不手動初始化的話,似乎vector只會初始化一行,所以需要使用vector<vector<int>> vec(row, vector<int> (col,0)); -- 用 0 來初始化二維vector這一行代碼,前面是row的數(shù)量,后面是col的數(shù)量。
第二,dp的初始化。第一次寫的時候,初始化很想當(dāng)然,理清思路以后初始化還是比較簡單的。文章來源地址http://www.zghlxwxcb.cn/news/detail-470641.html

到了這里,關(guān)于01背包問題-遞推公式的自我理解與LeetCode 416. 分割等和子集的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Day42|動態(tài)規(guī)劃part04: 01背包問題,你該了解這些!、滾動數(shù)組、416. 分割等和子集

    Day42|動態(tài)規(guī)劃part04: 01背包問題,你該了解這些!、滾動數(shù)組、416. 分割等和子集

    其他背包,面試幾乎不會問,都是競賽級別的了,leetcode上連多重背包的題目都沒有,所以題庫也告訴我們,01背包和完全背包就夠用了。 而完全背包又是也是01背包稍作變化而來,即:完全背包的物品數(shù)量是無限的。 01 背包問題描述 有n件物品和一個最多能背重量為w 的背包

    2024年04月25日
    瀏覽(17)
  • leetcode刷題之背包問題(01背包)

    leetcode刷題之背包問題(01背包)

    01 背包 概念:有n件物品和一個最多能背重量為w 的背包。第i件物品的重量是 w e i g h t [ i ] weight[i] w e i g h t [ i ] ,得到的價值是 v a l u e [ i ] value[i] v a l u e [ i ] 。每件物品只能用一次,求解將哪些物品裝入背包里物品價值總和最大。 方法1:暴力回溯法 方法2:動態(tài)規(guī)劃 三個

    2024年02月02日
    瀏覽(153)
  • 【第二十五課】動態(tài)規(guī)劃:完全背包問題(acwing-3 / 公式推導(dǎo) / 思路理解 / 優(yōu)化 / c++代碼)

    【第二十五課】動態(tài)規(guī)劃:完全背包問題(acwing-3 / 公式推導(dǎo) / 思路理解 / 優(yōu)化 / c++代碼)

    目錄 思路 樸素代碼 優(yōu)化 公式推導(dǎo)上? 二維代碼? 一維代碼 公式理解上 ? 在開始看完全背包問題之前,可能需要先了解01背包及其解決辦法。 指路?? 【第二十五課】動態(tài)規(guī)劃:01背包問題(acwing-2 / 思路 / 含一維數(shù)組優(yōu)化 / c++代碼) 這個問題和01背包的區(qū)別就是 每件物品可以

    2024年03月19日
    瀏覽(45)
  • 【十七】【動態(tài)規(guī)劃】DP41 【模板】01背包、416. 分割等和子集、494. 目標(biāo)和,三道題目深度解析

    【十七】【動態(tài)規(guī)劃】DP41 【模板】01背包、416. 分割等和子集、494. 目標(biāo)和,三道題目深度解析

    動態(tài)規(guī)劃就像是解決問題的一種策略,它可以幫助我們更高效地找到問題的解決方案。這個策略的核心思想就是將問題分解為一系列的小問題,并將每個小問題的解保存起來。這樣,當(dāng)我們需要解決原始問題的時候,我們就可以直接利用已經(jīng)計算好的小問題的解,而不需要重

    2024年02月03日
    瀏覽(26)
  • 【LeetCode動態(tài)規(guī)劃#06】分割等和子集(01背包問題一維寫法實戰(zhàn))

    分割等和子集 給你一個 只包含正整數(shù) 的 非空 數(shù)組 nums 。請你判斷是否可以將這個數(shù)組分割成兩個子集,使得兩個子集的元素和相等。 示例 1: 輸入:nums = [1,5,11,5] 輸出:true 解釋:數(shù)組可以分割成 [1, 5, 5] 和 [11] 示例 2: 輸入:nums = [1,2,3,5] 輸出:false 解釋:數(shù)組不能分割

    2023年04月09日
    瀏覽(121)
  • 【LeetCode動態(tài)規(guī)劃#07】01背包問題一維寫法(狀態(tài)壓縮)實戰(zhàn),其二(目標(biāo)和、零一和)

    【LeetCode動態(tài)規(guī)劃#07】01背包問題一維寫法(狀態(tài)壓縮)實戰(zhàn),其二(目標(biāo)和、零一和)

    力扣題目鏈接(opens new window) 難度:中等 給定一個非負整數(shù)數(shù)組,a1, a2, ..., an, 和一個目標(biāo)數(shù),S?,F(xiàn)在你有兩個符號 + 和 -。對于數(shù)組中的任意一個整數(shù),你都可以從 + 或 -中選擇一個符號添加在前面。 返回可以使最終數(shù)組和為目標(biāo)數(shù) S 的所有添加符號的方法數(shù)。 示例: 輸入

    2023年04月18日
    瀏覽(88)
  • 代碼隨想錄day42|背包問題、416. 分割等和子集

    代碼隨想錄day42|背包問題、416. 分割等和子集

    ?背包問題: ? ?01 背包 二維數(shù)組dp[i][j]解法 純01背包:有n件物品和一個最多能背重量為w 的背包。第i件物品的重量是weight[i],得到的價值是value[i] 。 每件物品只能用一次 ,求解將哪些物品裝入背包里物品價值總和最大。 dp[i][j]:從下標(biāo)為[0-i]的物品里任意取,放進容量為j的

    2024年04月09日
    瀏覽(89)
  • 背包問題——01背包|完全背包

    背包問題——01背包|完全背包

    目錄 前言背包問題的歷史 ?01背包 ?1、題目 2、暴力解01背包 ?Ⅰ、代碼 3、動態(tài)規(guī)劃解01背包 Ⅰ、二維dp數(shù)組解01背包 1)dp數(shù)組的含義 ?2)遞推公式 ?3)dp數(shù)組的初始化 ?4)遍歷順序的討論 ?5、代碼 ?Ⅱ、一維數(shù)組解01背包 ?1)一維數(shù)組|滾動數(shù)組 ?2)一維數(shù)組的含義及遞

    2024年02月02日
    瀏覽(23)
  • 背包問題(貪心)& 二維01背包問題 Java

    題目描述 有n件物品和一個最大承重為w 的背包。第i件物品的重量是weight[i],每件只能用一次,求裝入背包的最多物品數(shù)量。 題目分析 因為我們 只要求裝入物品的數(shù)量 ,所以 裝重的顯然沒有裝輕的劃算 。 因此將 數(shù)組weight[i]按從小到大排序 , 依次選擇每個物品 ,直到裝不

    2024年01月17日
    瀏覽(20)
  • 背包問題分析代碼詳解【01背包+完全背包+多重背包】

    一、01背包問題 問題描述: 有 N 件物品和一個容量為 V 的背包,每件物品有各自的價值且只能被選擇一次,要求在有限的背包容量下,裝入的物品總價值最大。 樸素01背包 狀態(tài)f[i , j]定義:在前i個物品中選,總體積不超過j的價值最大值 狀態(tài)轉(zhuǎn)移 1) 選第i個物品:f[i,j] = f

    2024年02月06日
    瀏覽(16)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包