動態規劃法 入門題 01揹包問題

2021-09-25 03:36:35 字數 2113 閱讀 4263

01揹包問題(0-1 knapsack problem)

題意:先有價值為

輸入第1行輸入2個整數n,w,空格隔開。接下來n行輸入第i個物品的價值

輸出輸出總價值的最大值,佔1行

限制

輸入示例

4 54 25 2

2 18 3

輸出

題解分析

「選」與「不選」對每次的值進行更新。首先、我們要準備一些變數

struct itema[max+1];//用來存放物品資訊

int dp[max+1][10001];//dp[i][j]代表前i個物品在容量為j時的最大價值

//dp陣列的初始化 

for(int i=0;i<=n;i++)

設第i的物品進入了是否放入容量為j揹包的考慮範圍:

"不選":

取最大值:

for(int i=1;i<=n;i++)
初始化的dp陣列裡的值:vw

0123

4542

0000

0052

0000

0012

0000

0083

0000

00將a[1]放入容量由0到5的揹包裡:vw

0123

4542

0044

4452

0120

830

將a[2]放入容器由0-5的揹包裡:vw

0123

4542

0044

4452

0055

9912

0830

最後形成:vw

0123

4542

0044

4452

0055

9912

0257

91183

0258

1013

**部分為:

#include#includeusing namespace std;

#define max 100

#define wmax 10001

struct itema[max+1];

int n,dp[max+1][10001];

int main()

//dp陣列的初始化

for(int i=0;i<=n;i++)

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

cout敲了這麼多天的**,**質量水準還是一成不變(為了解題而解題)。我們可以記錄下是哪些物品被挑選。

#include#include#includeusing namespace std;

#define nmax 105

#define wmax 10005

#define diagonal 1

#define top 0

struct item;

int n,w;

item items[nmax+1];

int c[nmax+1][wmax+1],g[nmax+1][wmax+1];

void compute(int &maxvalue,vector&selection)

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

c[i][0]=0;

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

} }maxvalue=c[n][w];

//完成統計操作

selection.clear();

for(int i=n,w=w;i>=1;i--)

} //追本溯源

reverse(selection.begin(),selection.end());

}void input()

}int main()

cout加油!

0 1揹包問題 動態規劃法

問題描述 給定n種物品和一揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 1揹包問題。資料...

0 1揹包問題 動態規劃法

問題描述 給定n種物品和一揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 1揹包問題。資料...

動態規劃法 01揹包問題

一 幾個概念 最優化問題 有 n個輸入。它的解由這 n個輸入的乙個子集組成,這個子集必須滿足某些事先給定的條件。這些條件稱為約束條件。滿足約束條件的解稱為問題的可行解。滿足約束條件的可行解可能不止乙個,為了衡量這些可行解的優劣,事先給出一定的標準,這些標準通常以函式的形式給出。這些標準函式稱為目標函...