動態規劃 揹包問題(離散0 1 0 N

2021-10-10 07:33:34 字數 961 閱讀 4658

問題:

給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。應如何選擇裝入揹包中的物品,使得裝入揹包中物品的

總價值最大。

在選擇裝入揹包的物品時,對每種物品i只有兩個選擇,裝入揹包或不裝入揹包,也不能將物品裝入揹包多次(0-1)。

分析:

子結構:m(i,j):序號為i,i+1,…n的若干待裝物品,揹包容量為j,最大價值。

遞推結構:第i個物品,若裝得下,有兩種選擇,選或者不選;若裝不下,那就直接不選。

m(i,j) = m(i+1,j),j=wi

初始化第n+1行、第一列為0

**:

#include using namespace std;

#define maxc 105

// 0-1揹包問題

// 輸入:物品數量n,揹包容量c,物品重量w,物品價值v,i到n的物品的容量為c最大價值矩陣m[i][c],結果記錄矩陣a

void knapsack(int n,int c,int w,int v,int m[maxc],int a[maxc])elseelse}}

}}// 根據結果記錄矩陣a構造最優解

void traceback(int a[maxc],int i,int j,int n,int w)else}}

}}// 根據結果記錄矩陣a構造最優解

void traceback(int a[maxc],int i,int j,int n,int w){

if(i==n+1 || j==0) return;

if(a[i][j]==0)

traceback(a, i+1, j, n, w);

else{

cout<複雜度:

時間複雜度:o(nc)

空間複雜度:o(nc)

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...

動態規劃 揹包問題

1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...