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

動態(tài)規(guī)劃母題:01背包問題

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

1.?前置知識

動態(tài)規(guī)劃與圖論,前綴和與差分等有模板的算法不同,動態(tài)規(guī)劃更考察思維能力,而不是運用模板的能力。

個人認(rèn)為 Acwing?關(guān)于動態(tài)規(guī)劃的講解比較容易理解。我會根據(jù) Acwing?的動態(tài)規(guī)劃解題思路來講解題目。

雖說動態(tài)規(guī)劃沒有固定的模板,但是還是有相對固定的套路。但是思維能力以及經(jīng)驗積累在解決動態(tài)規(guī)劃的題目中十分重要。

動態(tài)規(guī)劃母題:01背包問題,數(shù)據(jù)結(jié)構(gòu)與算法,動態(tài)規(guī)劃,算法

集合:表示狀態(tài)中每一個下標(biāo)位置可能的選擇。

屬性:表示狀態(tài)中每一個下標(biāo)位置可能的選擇的屬性。(一般是最大值或者最小值,將選擇附加上屬性,就會得到每一個下標(biāo)位置的最終結(jié)果)。

狀態(tài)計算:將每一個狀態(tài)中的集合進行劃分,根據(jù)集合的劃分推出狀態(tài)轉(zhuǎn)移方程。

集合劃分的依據(jù):劃分出來的所有集合的并集不得遺漏一個狀態(tài)中的任何選擇。但是可以重復(fù)。

這些東東可能會很抽象,后面的例題會幫助大家理解這寫東東。

2. 01背包問題 (來源:Acwing)

原題鏈接:2. 01背包問題 - AcWing題庫

題目描述:

有?N 件物品和一個容量是?V 的背包。每件物品只能使用一次。

第?i?件物品的體積是?vi,價值是?wi。

求解將哪些物品裝入背包,可使這些物品的總體積不超過背包容量,且總價值最大。
輸出最大價值。

輸入格式:

第一行兩個整數(shù),N,V,,用空格隔開,分別表示物品數(shù)量和背包容積。

接下來有?N?行,每行兩個整數(shù)?vi, wi,用空格隔開,分別表示第?i?件物品的體積和價值。

輸出格式:

輸出一個整數(shù),表示最大價值。

數(shù)據(jù)范圍:

0 < N, V ≤1000
0< vi, wi ≤1000

輸入樣例:

4 5
1 2
2 4
3 4
4 5

輸出樣例:

8

我們直接按照上面給出的套路來:

狀態(tài)表示:f [i, j] (代表狀態(tài)是一個二維的,這里就不寫成二維數(shù)組的形式了,比較麻煩。)?

二維數(shù)組中每一個下標(biāo)代表的集合:從 1 -?i?個物品中選,并且總體積不超過?j?的選法的集合。

屬性:集合中選法的最大價值。(將屬性附加到集合得到的結(jié)果就是二維數(shù)組中每個下標(biāo)的結(jié)果)

狀態(tài)計算:

集合劃分:將狀態(tài)劃分成兩個集合:1:從1 -?i?個物品中選,選擇?i ,且價值不超過?j?的所有選法;2:從 1 - (i - 1)?個物品選,不選擇?i ,且價值不超過?j?的所有選法。

劃分依據(jù)的驗證:二維數(shù)組每一個下標(biāo)的最終值就是,代表從 1 -?i?個物品中選,且總體積不超過?j?的選法的價值最大值。顯然這個集合劃分沒有漏掉該下標(biāo)位置對應(yīng)的所有選法。

狀態(tài)轉(zhuǎn)移方程:根據(jù)集合劃分,我們只要求出劃分出的兩個集合中所有選法價值的最大值即可。

動態(tài)規(guī)劃母題:01背包問題,數(shù)據(jù)結(jié)構(gòu)與算法,動態(tài)規(guī)劃,算法

注意:j -?v[i]?必須保證?j >= v[i]?哦!最終的答案就是 f[N][V] 。

#include<iostream>
using namespace std;

const int N = 1010;
int v[N], w[N];
int f[N][N];
int m, n;

int main()
{
    cin >> m >> n;
    for(int i = 1; i <= m; i++)
        cin >> v[i] >> w[i];
        
    f[0][0] = 0; // 全局變量默認(rèn)初始化為0,可以不寫
    for(int i = 1; i <= m; i++)
    {
        for(int j = 0; j <= n; j++)
        {
            f[i][j] = f[i - 1][j];
            if(j >= v[i])
                f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
        }
    }
    cout << f[m][n] << endl;
        
    return 0;
}

?3.?空間優(yōu)化

直接將狀態(tài)從二維壓縮到一維,觀察結(jié)果會不會出錯:

f[ i ][ j ] = f[ i - 1][ j ],用到的是上一層即?i - 1?層的狀態(tài),若遍歷體積大小( j )是從小到大遍歷,那么狀態(tài)壓縮之后的計算結(jié)果就是用第 i?層的狀態(tài)來算的,不正確,因此我們需要改變遍歷的順序,從大到小遍歷。

f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]),用到的同樣是上一層的狀態(tài),因此同樣不能從小到達(dá)遍歷體積,必須從大到小遍歷體積才能保證狀態(tài)的轉(zhuǎn)移是從上一層來的。

綜上所述,只需要改變體積的遍歷順序就可以將二維的狀態(tài)壓縮到一維。文章來源地址http://www.zghlxwxcb.cn/news/detail-529370.html

#include<iostream>
using namespace std;

const int N = 1010;
int v[N], w[N];
int f[N];
int m, n;

int main()
{
    cin >> m >> n;
    for(int i = 1; i <= m; i++)
        cin >> v[i] >> w[i];
        
    f[0] = 0; // 全局變量默認(rèn)初始化為0,可以不寫
    for(int i = 1; i <= m; i++)
        for(int j = n; j - v[i] >= 0; j--)
            f[j] = max(f[j], f[j - v[i]] + w[i]);
            
    cout << f[n] << endl;
        
    return 0;
}

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

  • Java數(shù)據(jù)結(jié)構(gòu)與算法----動態(tài)規(guī)劃(背包篇)

    Java數(shù)據(jù)結(jié)構(gòu)與算法----動態(tài)規(guī)劃(背包篇)

    1.1.算法思路 0/1背包是動態(tài)規(guī)劃、背包問題中最經(jīng)典的問題啦!它主要的問題是: 給定n種物品、這n種物品的重量分別是,價值分別是?,而你有一個容量為C的背包,請問如何求出所能拿的最大價值呢? 對于動態(tài)規(guī)劃,我們先需要找到一條推導(dǎo)公式,然后確定邊界: 我們設(shè)

    2024年02月07日
    瀏覽(30)
  • 【動態(tài)規(guī)劃專欄】-- 01 背包問題 -- 動態(tài)規(guī)劃經(jīng)典題型

    【動態(tài)規(guī)劃專欄】-- 01 背包問題 -- 動態(tài)規(guī)劃經(jīng)典題型

    目錄 背包問題概述 01 背包問題 01背包??? 【算法原理】 第一問 第二問 C++ 算法代碼 復(fù)雜度分析 【空間優(yōu)化 - 滾動數(shù)組】 C++ 算法代碼 復(fù)雜度分析 分割等和子集?? 【算法原理】? 對于類01背包問題 C++ 算法代碼? 【空間優(yōu)化 - 滾動數(shù)組】? C++ 算法代碼 目標(biāo)和?? 【算

    2024年02月05日
    瀏覽(21)
  • 動態(tài)規(guī)劃:01背包問題(二)

    動態(tài)規(guī)劃:01背包問題(二)

    上篇博客動態(tài)規(guī)劃:01背包問題(一)將的是用二維數(shù)組來解決,而本篇博客就是把二維dp數(shù)組降為一維dp數(shù)組(滾動數(shù)組)在使用二維數(shù)組的時候,遞推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 其實可以發(fā)現(xiàn)如果 把dp[i - 1]那一層拷貝到dp[i]上 ,表達(dá)式完全可以是

    2024年01月22日
    瀏覽(23)
  • 動態(tài)規(guī)劃-01背包問題

    動態(tài)規(guī)劃-01背包問題

    算法思路: 背包問題的狀態(tài)表??常經(jīng)典,如果?家不知道怎么來的,就把它當(dāng)成?個「模板」記住吧~ 我們先解決第?問: 1. 狀態(tài)表? : dp[i][j] 表?:從前 i 個物品中挑選,總體積「不超過」 j ,所有的選法中,能挑選出來 的最?價值。 2. 狀態(tài)轉(zhuǎn)移?程 : 線性 dp 狀態(tài)

    2024年04月11日
    瀏覽(36)
  • 動態(tài)規(guī)劃01背包問題

    動態(tài)規(guī)劃01背包問題

    假設(shè)你是一名經(jīng)驗豐富的探險家,背著背包來到野外進行日常探險。天氣晴朗而不燥熱,山間的風(fēng)夾雜著花香,正當(dāng)你欣賞這世外桃源般的美景時,突然,你發(fā)現(xiàn)了一個洞穴,這個洞穴外表看起來其貌不揚,但憑借著驚為天人的直覺,這個洞穴不簡單。于是,你開始往洞穴內(nèi)

    2024年02月06日
    瀏覽(22)
  • 動態(tài)規(guī)劃_01背包問題

    描述 一個旅行者有一個最多能裝 ? M ? 公斤的背包,現(xiàn)在有 ? n ? 件物品,它們的重量分別是 ? W 1 ? , W 2 ? , ... , W n ? , 它們的價值分別為 ? C 1 ? , C 2 ? , ... , C n ? ,求旅行者能獲得最大總價值。 輸入描述 第 1 行:兩個整數(shù), M ? (背包容量, M ≤ 200 ? )和 ? N ?

    2024年04月29日
    瀏覽(18)
  • 【動態(tài)規(guī)劃】01背包問題

    【動態(tài)規(guī)劃】01背包問題

    動態(tài)規(guī)劃是一種非常常見的算法,不論是在我們平時刷題的過程中還是在競賽中,總會見到動態(tài)規(guī)劃的身影,而動態(tài)規(guī)劃又分為很多種,其中01背包問題是非常典型的一類動態(tài)規(guī)劃問題。如果大家之前沒有了解過動態(tài)規(guī)劃,建議大家先去學(xué)習(xí)學(xué)習(xí)動態(tài)規(guī)劃,直接開始01背包問題

    2024年04月15日
    瀏覽(18)
  • 動態(tài)規(guī)劃(01背包問題)

    動態(tài)規(guī)劃(01背包問題)

    本文默認(rèn)讀者具有動態(tài)規(guī)劃前置知識 動態(tài)規(guī)劃的特點: 重疊子問題 狀態(tài)轉(zhuǎn)移方程 最優(yōu)子結(jié)構(gòu) 題型: 求最值 解題套路: 明確【狀態(tài)】 明確【選擇】 明確dp函數(shù)/數(shù)據(jù)的定義 明確base case 例:給你一個可裝載容量為W的背包和N個物品,每個物品有重量和價值兩個屬性。其中第

    2024年04月16日
    瀏覽(24)
  • 動態(tài)規(guī)劃——01背包問題

    動態(tài)規(guī)劃——01背包問題

    由于本人實力尚淺,接觸算法沒多久,寫這篇blog僅僅是想要提升自己對算法的理解,如果各位讀者發(fā)現(xiàn)什么錯誤,懇請指正,希望和大家一起進步。(●’?’●) 狀態(tài)表示 :用一個數(shù)組 f[][] (數(shù)組可能是一維也可能是二維,根據(jù)具體題目具體分析)來表示某個集合,這個集合

    2024年02月03日
    瀏覽(29)
  • 算法系列--動態(tài)規(guī)劃--背包問題(1)--01背包介紹

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

    ??\\\"趁著年輕,做一些比較cool的事情\\\"?? 作者:Lvzi 文章主要內(nèi)容:算法系列–動態(tài)規(guī)劃–背包問題(1)–01背包介紹 大家好,今天為大家?guī)淼氖?算法系列--動態(tài)規(guī)劃--背包問題(1)--01背包介紹 背包問題是動態(tài)規(guī)劃中經(jīng)典的一類問題,經(jīng)常在筆試面試中出現(xiàn),是非常 具有區(qū)分度 的題

    2024年04月16日
    瀏覽(93)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包