2021 02 25動態規劃 0 1揹包問題

2021-10-20 04:49:58 字數 1319 閱讀 5521

0/1揹包問題——動態規劃模板

孿生兄弟:完全揹包問題

動態規劃是將問題不斷細分,將大問題劃分為小問題,再逐步解決的方法。滿足無後效性和最優子結構。動態規劃應用最明顯的特徵就是每個子問題都僅僅求解一次,並在求解之後將結果保留。在下一次遇到同樣的問題時可以直接得出答案。

0/1揹包問題是指有m中物品,每一種物品都有其對應的價值。在揹包體積不超過n的情況下,裝走最大價值的物品,且每一種物品都最多選取一次。由於每一次選取物品後的最大價值,都和上一次選取後的總價值有關,因此該問題具有最優子結構,可用動態規劃求解。

具體的狀態轉移方程見官方的**的題目解答洛谷p1048採藥——題目解答

這裡只強調一點,就是**中內層迴圈要逆著遍歷,從大到小。如果是從小到大,即從1到n,則對應另一種動態規劃問題——完全揹包問題(一件物品可以重複多次選擇)

另乙個細節就是,本道題可以採用二維陣列的方式進行,即ans[m][n],其中m是物品的件數,n是總時間限制。那麼任何乙個元素ans[i][j]則表示在前i件物品中用時長為j的時間獲得的最大利潤。

當然,更高效的是可以採用一維陣列的方式進行求解。**基本一樣 ,但是意義沒有二位陣列明顯。即ans[n]中的每乙個元素ans[i]表示在時間為i的前提下,獲得的最大利潤,可以從n件物品中任意選取。

但是,無論是一維還是二維,其本質思想都是根據狀態轉移方程不斷更新,得到最優值。

方法一:採用一維陣列

#include

#include

#include

using

namespace std;

#pragma warning(disable:4996)

class

solution

/*for(int i=1;i<=n;++i)

cout << ans[i] << " ";

cout << endl;*/

} cout << ans[n]

<;int

main()

方法二:二維陣列求解:

#include

#include

#include

#pragma warning(disable:4996)

using

namespace std;

class

solution;}

for(

int i =

1; i <= m;

++i)

} cout << ans[m]

[n];}}

;int

main()

動態規劃 01揹包

最優二叉查詢樹.cpp 定義控制台應用程式的入口點。01揹包問題。include stdafx.h include include define n 3 the number of real node define m 10 using namespace std int tmain int arg...

01揹包動態規劃

0 1揹包 問題描述 乙個旅行者有乙個最多能用 m公斤的揹包,現在有 n件物品,它們的重量 分別是w1,w2 wn,它們的價值分別為 c1,c2,cn.若每種物品只有一 件求旅行者能獲得最大總價值。輸入格式 w 第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 w第2.n 1 行...

0 1揹包(動態規劃)

題意 有n件物品和乙個容量為v的揹包。第i件物品的體積是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。基本思路 這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程...