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

算法系列--動(dòng)態(tài)規(guī)劃--背包問題(1)--01背包介紹

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

??"趁著年輕,做一些比較cool的事情"??
作者:Lvzi
文章主要內(nèi)容:算法系列–動(dòng)態(tài)規(guī)劃–背包問題(1)–01背包介紹
動(dòng)態(tài)規(guī)劃算法解決01背包問題,算法,動(dòng)態(tài)規(guī)劃

大家好,今天為大家?guī)淼氖?code>算法系列--動(dòng)態(tài)規(guī)劃--背包問題(1)--01背包介紹

一.什么是背包問題

背包問題是動(dòng)態(tài)規(guī)劃中經(jīng)典的一類問題,經(jīng)常在筆試面試中出現(xiàn),是非常具有區(qū)分度的題目

背包問題的種類很多,變式多,也就使得背包問題的難度一般都很高,而01背包問題屬于其中最基礎(chǔ),可以當(dāng)做思考模版的題目,下面就來講解–01背包問題

前情提示:如果你沒有動(dòng)態(tài)規(guī)劃的基礎(chǔ),還是盡量不要通過背包問題入門,先去做上幾十到動(dòng)態(tài)規(guī)劃的題目再來學(xué)習(xí)背包問題

二.01背包問題

鏈接:
01背包問題

動(dòng)態(tài)規(guī)劃算法解決01背包問題,算法,動(dòng)態(tài)規(guī)劃

分析:

首先要明確這道題目一共有兩問,第一問求的是在不超過背包限制的前提下,可以得到的最大價(jià)值
,第二問求的是在剛好裝滿背包的情況下,可以得到的最大價(jià)值

第一問:求這個(gè)背包至多能裝多大價(jià)值的物品?

我們先來模擬一下背包問題的執(zhí)行過程,其實(shí)就是從所有物品中選擇合適的物品填入背包,來實(shí)現(xiàn)價(jià)值的最大化,在選物品時(shí)我們是可以任意選擇的,這不就類似于在任意的子序列中,選出最大xxxx的問題么?

好了,相信大家也能分析到這里,說:這不就是一個(gè)簡(jiǎn)單的子序列問題么,這有啥難得,于是興致勃勃的寫下狀態(tài)表示

  • dp[i]:表示在[1,i]之間的所有物品中,可以實(shí)現(xiàn)的最大價(jià)值物品的價(jià)值

(注:下標(biāo)我們從1開始是因?yàn)檫@是dp問題常用的一種初始化dp表的方式)

但是我們?cè)谔?code>i位置的值時(shí),需要考慮此時(shí)背包容量對(duì)我們裝填的影響(比如如果背包的容量很小,只有1,而我們i物品的體積是99,肯定無法裝進(jìn)去)

所以我們還需要一個(gè)狀態(tài)來表示背包體積,也就是每走到一個(gè)物品都要保證符合容量大小,于是狀態(tài)表示如下:

  • dp[i][j]:在[1,i]之間的所有物品中,體積不超過j,可以實(shí)現(xiàn)的最大價(jià)值物品的價(jià)值

我們可以驗(yàn)證一下這個(gè)狀態(tài)表示能否返回最終的結(jié)果呢?可以,dp[n][V]就表示在所給定的n個(gè)物品中,體積不超過背包的最大體積V,選擇可以實(shí)現(xiàn)最大價(jià)值的物品的價(jià)值

接下來就來推到狀態(tài)轉(zhuǎn)移方程:

狀態(tài)轉(zhuǎn)移方程一般就是根據(jù)最后一個(gè)位置的狀態(tài)去討論,在本題中,分類討論的依據(jù)就是包不包括最后一個(gè)物品
動(dòng)態(tài)規(guī)劃算法解決01背包問題,算法,動(dòng)態(tài)規(guī)劃

注意:選nums[i]這種情況不是一定能實(shí)現(xiàn)的,需要滿足此時(shí)的背包體積大于第i個(gè)物品的體積,也就是需要滿足j - v[i] >= 0

返回值:dp[n][V]
以上就是第一問的詳細(xì)分析過程

第二問:若背包恰好裝滿,求至多能裝多大價(jià)值的物品?

相較于第一問多了體積的限制,必須要滿足體積的前提下實(shí)現(xiàn)價(jià)值的最大化,但是大致的思路和第一問很像,只需要在第一問的基礎(chǔ)上做出一些改變即可:

  • dp[i][j]:表示在[0,i]區(qū)間內(nèi)的物品,在體積為j的前提下,可以實(shí)現(xiàn)的最大價(jià)值

狀態(tài)轉(zhuǎn)移方程

動(dòng)態(tài)規(guī)劃算法解決01背包問題,算法,動(dòng)態(tài)規(guī)劃
這里多了個(gè)限制條件dp[i - 1][j - v[i]] != -1,還是根據(jù)題目要求得來的,要考慮一種特殊情況,也就是在[0,i]區(qū)間內(nèi)的物品根本無法組合成體積為j的情況(這也是會(huì)存在的),要想i位置存在價(jià)值,必須保證i-1位置剛好能夠?qū)崿F(xiàn)j-v[i]的體積

初始化相較于第一問也有所不同,具體來說需要把dp表的第一行初始化為-1(除了dp[0][0]),第一行代表不選擇任何物品,也就無法構(gòu)成滿足j體積這個(gè)條件,我們將其設(shè)置為-1

之所以設(shè)置為-1是為了和dp[0][0] = 0這種情況作區(qū)分

代碼:

import java.util.Scanner;

// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {
    static int N = 1010;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), V = in.nextInt();// 獲取物品數(shù)目和背包體積

        // 處理第一問
        int[] v = new int[N],w = new int[N];// 存儲(chǔ)物品的體積和價(jià)值
        for(int i = 1; i <= n; i++) {// 輸入數(shù)值
            v[i] = in.nextInt(); 
            w[i] = in.nextInt();
        }

        int[][] dp = new int[N][N];
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= V; j++) {
                dp[i][j] = dp[i - 1][j];
                if(j - v[i] >= 0) 
                    dp[i][j] = Math.max(dp[i - 1][j],dp[i - 1][j - v[i]] + w[i]);
            }
        }

        System.out.println(dp[n][V]);

        // 處理第二問
        dp = new int[N][N];
        for(int j = 1; j <= V; j++) {// 初始化
            dp[0][j] = -1;
        }

        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= V; j++) {
                dp[i][j] = dp[i - 1][j];
                if(j - v[i] >= 0 && dp[i - 1][j - v[i]] != -1)
                    dp[i][j] = Math.max(dp[i - 1][j],dp[i - 1][j - v[i]] + w[i]);
            }
        }
        System.out.println(dp[n][V] == -1 ? 0 : dp[n][V]);
    }
}

上述解法的空間復(fù)雜度是很高的,我們開辟的dp表是一個(gè)N*N的,下面介紹使用滾動(dòng)數(shù)組實(shí)現(xiàn)空間優(yōu)化

動(dòng)態(tài)規(guī)劃算法解決01背包問題,算法,動(dòng)態(tài)規(guī)劃

空間優(yōu)化之后的代碼:

import java.util.Scanner;

// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {
    static int N = 1010;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), V = in.nextInt();// 獲取物品數(shù)目和背包體積

        // 處理第一問
        int[] v = new int[N],w = new int[N];// 存儲(chǔ)物品的體積和價(jià)值
        for(int i = 1; i <= n; i++) {// 輸入數(shù)值
            v[i] = in.nextInt(); 
            w[i] = in.nextInt();
        }

        int[] dp = new int[N];
        for(int i = 1; i <= n; i++) 
            for(int j = V; j >= v[i]; j--) 
                dp[j] = Math.max(dp[j],dp[j - v[i]] + w[i]);
            
        System.out.println(dp[V]);

        // 處理第二問
        dp = new int[N];
        for(int j = 1; j <= V; j++) 
            dp[j] = -1;// 初始化

        for(int i = 1; i <= n; i++) 
            for(int j = V; j >= v[i]; j--) 
                if(j - v[i] >= 0 && dp[j - v[i]] != -1)
                    dp[j] = Math.max(dp[j],dp[j - v[i]] + w[i]);
              
        System.out.println(dp[V] == -1 ? 0 : dp[V]);
    }
}

總結(jié):本文的核心要點(diǎn)

  1. 什么是背包問題
  2. 01背包問題詳解
  3. 背包問題的空間優(yōu)化(滾動(dòng)數(shù)組)

以上就是算法系列--動(dòng)態(tài)規(guī)劃--背包問題(1)--01背包介紹全部?jī)?nèi)容,下一篇文章將會(huì)帶來01背包問題的拓展題目,敬請(qǐng)期待,我是LvZi文章來源地址http://www.zghlxwxcb.cn/news/detail-853300.html

到了這里,關(guān)于算法系列--動(dòng)態(tài)規(guī)劃--背包問題(1)--01背包介紹的文章就介紹完了。如果您還想了解更多內(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)文章

  • 算法分析與設(shè)計(jì)——?jiǎng)討B(tài)規(guī)劃求解01背包問題

    算法分析與設(shè)計(jì)——?jiǎng)討B(tài)規(guī)劃求解01背包問題

    假設(shè)有四個(gè)物品,如下圖,背包總?cè)萘繛?,求背包裝入哪些物品時(shí)累計(jì)的價(jià)值最多。 我們使用動(dòng)態(tài)規(guī)劃來解決這個(gè)問題,首先使用一個(gè)表格來模擬整個(gè)算法的過程。 表格中的信息表示 指定情況下能產(chǎn)生的最大價(jià)值 。例如, (4, 8)表示在背包容量為8的情況下,前四個(gè)物品的最

    2024年02月04日
    瀏覽(93)
  • 算法套路十四——?jiǎng)討B(tài)規(guī)劃之背包問題:01背包、完全背包及各種變形

    算法套路十四——?jiǎng)討B(tài)規(guī)劃之背包問題:01背包、完全背包及各種變形

    如果對(duì)遞歸、記憶化搜索及動(dòng)態(tài)規(guī)劃的概念與關(guān)系不太理解,可以前往閱讀算法套路十三——?jiǎng)討B(tài)規(guī)劃DP入門 背包DP介紹:https://oi-wiki.org/dp/knapsack/ 0-1背包:有n個(gè)物品,第i個(gè)物品的體積為w[i],價(jià)值為v[i],每個(gè)物品至多選一個(gè), 求體積和不超過capacity時(shí)的最大價(jià)值和,其中i從

    2024年02月10日
    瀏覽(89)
  • C++算法初級(jí)11——01背包問題(動(dòng)態(tài)規(guī)劃2)

    C++算法初級(jí)11——01背包問題(動(dòng)態(tài)規(guī)劃2)

    辰辰采藥 辰辰是個(gè)天資聰穎的孩子,他的夢(mèng)想是成為世界上最偉大的醫(yī)師。為此,他想拜附近最有威望的醫(yī)師為師。醫(yī)師為了判斷他的資質(zhì),給他出了一個(gè)難題。醫(yī)師把他帶到一個(gè)到處都是草藥的山洞里對(duì)他說:“孩子,這個(gè)山洞里有一些不同的草藥,采每一株都需要一些時(shí)

    2024年02月02日
    瀏覽(92)
  • 動(dòng)態(tài)規(guī)劃——使用python解決01背包問題

    動(dòng)態(tài)規(guī)劃——使用python解決01背包問題

    目錄 什么是01背包問題? 題目: 輸入格式: 輸出格式: 代碼實(shí)現(xiàn): 代碼執(zhí)行示例: 代碼解析: ? ? ? ? 01背包問題是一個(gè)經(jīng)典的組合優(yōu)化問題,通常用于描述如下情境:假設(shè)有一個(gè)背包,它能夠承受一定的重量上限(即背包容量),同時(shí)有一組物品,每件物品有自己的重

    2024年02月03日
    瀏覽(26)
  • 【算法日志】動(dòng)態(tài)規(guī)劃刷題:01背包問題,多重背包問題(day37,day38)

    【算法日志】動(dòng)態(tài)規(guī)劃刷題:01背包問題,多重背包問題(day37,day38)

    目錄 前言 目標(biāo)和(01背包) 一和零(01背包) 零錢兌換(多重背包) 排列總和(多重背包) 這兩天都是背包問題,其中的01背包的一些應(yīng)用問題需要一定的數(shù)學(xué)建模能力,需要i將實(shí)際問題簡(jiǎn)化成我們熟悉的背包問題;而這兩天的多重背包問題還算比較基礎(chǔ),但也要我明白了

    2024年02月11日
    瀏覽(95)
  • 【算法|動(dòng)態(tài)規(guī)劃 | 01背包問題No.2】AcWing 423. 采藥

    【算法|動(dòng)態(tài)規(guī)劃 | 01背包問題No.2】AcWing 423. 采藥

    個(gè)人主頁(yè):兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【AcWing算法提高學(xué)習(xí)專欄】 ??本專欄旨在提高自己算法能力的同時(shí),記錄一下自己的學(xué)習(xí)過程,希望對(duì)大家有所幫助 ??希望我們一起努力、成

    2024年02月06日
    瀏覽(93)
  • 01背包問題三種解決(貪心動(dòng)態(tài)規(guī)劃分支限界)

    01背包問題三種解決(貪心動(dòng)態(tài)規(guī)劃分支限界)

    一、實(shí)驗(yàn)?zāi)康?1、深入理解背包相關(guān)問題。 2、能正確設(shè)計(jì)相應(yīng)的算法,解決實(shí)際問題。 ? 3、掌握算法時(shí)間復(fù)雜度分析。 二、實(shí)驗(yàn)要求 用3種方法求解0-1背包問題(貪心算法、 動(dòng)態(tài)規(guī)劃、分支限界法 ),獲得精確最優(yōu)解或近似最優(yōu)解均可。 通過一個(gè)規(guī)模較大的實(shí)例比較不同

    2024年02月02日
    瀏覽(18)
  • 算法設(shè)計(jì)與分析實(shí)驗(yàn)二:動(dòng)態(tài)規(guī)劃法求解TSP問題和01背包問題

    算法設(shè)計(jì)與分析實(shí)驗(yàn)二:動(dòng)態(tài)規(guī)劃法求解TSP問題和01背包問題

    【實(shí)驗(yàn)內(nèi)容】 (1)tsp問題:利用動(dòng)態(tài)規(guī)劃算法編程求解TSP問題,并進(jìn)行時(shí)間復(fù)雜性分析。 輸入:n個(gè)城市,權(quán)值,任選一個(gè)城市出發(fā); 輸出:以表格形式輸出結(jié)果,并給出向量解和最短路徑長(zhǎng)度。 (2)01背包問題:利用動(dòng)態(tài)規(guī)劃算法編程求解0-1背包問題,并進(jìn)行時(shí)間復(fù)雜性分

    2024年02月03日
    瀏覽(20)
  • 力扣算法刷題Day42|動(dòng)態(tài)規(guī)劃:01背包問題 分割等和子集

    力扣題目:01背包問題(二維數(shù)組) 刷題時(shí)長(zhǎng):參考題解 解題方法:動(dòng)態(tài)規(guī)劃 +?二維dp數(shù)組 復(fù)雜度分析 時(shí)間 空間 問題總結(jié) 理解遞推公式困難 本題收獲 動(dòng)規(guī)思路:兩層for循環(huán),第一層i遍歷物品,第二層j枚舉背包容量以內(nèi)所有值 確定dp數(shù)組及下標(biāo)的含義:dp[i][j] 表示從下標(biāo)

    2024年02月13日
    瀏覽(94)
  • 貪心算法解決背包問題和動(dòng)態(tài)規(guī)劃解決0-1背包問題(c語(yǔ)言)

    貪心算法解決背包問題和動(dòng)態(tài)規(guī)劃解決0-1背包問題(c語(yǔ)言)

    運(yùn)行結(jié)果如下: 運(yùn)行結(jié)果如下: 總結(jié): 貪心算法: 每一步都做出當(dāng)時(shí)看起來最佳的選擇,也就是說,它總是做出局部最優(yōu)的選擇。 貪心算法的設(shè)計(jì)步驟: 對(duì)其作出一個(gè)選擇后,只剩下一個(gè)子問題需要求解。 證明做出貪心選擇后,原問題總是存在最優(yōu)解,即貪心選擇總是安

    2024年02月04日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包