動態規劃解決01揹包問題

2021-08-19 17:49:27 字數 2443 閱讀 2650

0-1揹包(動態規劃)

問題描述:給定n種物品和一揹包。物品i的重量是wi,其價值是vi,揹包的容量為c。 問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?

問題分析:對於一種問題,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。

eg:物品個數n=5,物品重量w[n]=,物品價值v[n] = ,總重量c=10.

(第0位置為0不參與計算,只是便於與後面的下標進行統一,無特別用處)

最優值分析過程分析:

揹包中的物品設為空,首先,對物品i放入揹包的情況做分析,即在總重量從0到10時,如何放置物品n,使得總價值最大。如果物品i的重量超過揹包允許的總重量,則物品i不放入揹包,此時揹包中物品的總價值為0,否則,如果物品i裝入揹包後不超重,則裝入物品i,此時揹包的總價值為物品i的價值v[i].

m(i,j) i:放的物品是i,i+1,i+2……n j:揹包當前能夠承受的重量

1、從頭切: m(i,j)

i == n j>=wn vn:0 //揹包當前能夠承受的重量大於物品i的重量,就返回總價值vn,否則返回0.

i

int knapsack(int *w,int *v,int i,int j,int c)

else

}}int main()

; int v[n+1] = ;

int c = 10;

int value = knapsack(w,v,0,n,c);

printf("value = %d\n",value);

return0;}

2、用m表來存放已經計算過的總價值。m表為n+1行c+1列。

int **getarray(int n,int m)

return c;

}void freearray(int **c,int n)

void printarray(int **arr,int n,int m)

printf("\n");

}int knapsack(int *w,int *v,int i,int j,int c,int **m)

else

}return m[i][c];

}void backprint(int *w,int **m,int n,int c,int *x)

}if(m[i-1][c] != 0)

x[i-1] = true;

}int main()

; int v[n+1] = ;

int x[n+1] = ;

int c = 10;

int **m = getarray(n+1,c+1);

int value = knapsack(w,v,0,n,c,m);

printf("value = %d\n",value);

//printarray(m,n+1,c+1);

backprint(w,m,n+1,c,x);

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

if(x[i])

cout

<": w = "

<" v = "

<1);

return0;}

3、從尾切

m(i,j) i == 1 j>=w1 ? v1:0

i1,j)

i=wi max(m(i-1,j-wi)+vi,m(i-1,j))

int knapsack(int *w,int *v,int i,int c,int **m) //遞迴

else

else

}return m[1][c];

}int knapsack(int *w,int *v,int n,int c,int **m) //非遞迴

/* 對剩下的n-1個物品進行放置 */

for(i = n-1;i>=1;i--)}}

return m[1][c];

}void backprint(int *w,int **m,int n,int c,int *x)

}if(m[i-1][c] != 0)

x[i-1] = true;

}int main()

; int v[n+1] = ;

int x[n+1] = ;

int c = 10;

int **m = getarray(n+1,c+1);

int value = knapsack(w,v,n,c,m);

printf("value = %d\n",value);

printarray(m,n+1,c+1);

backprint(w,m,n+1,c,x);

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

if(x[i])

cout

<": w = "

<" v = "

<1);

return

0;}

動態規劃解決0 1揹包問題

把揹包問題抽象化 x1,x2,xn,其中 xi 取0或1,表示第 i 個物品選或不選 vi表示第 i個物品的價值,wi表示第 i 個物品的體積 重量 建立模型,即求max v1x1 v2x2 vnxn 約束條件,w1x1 w2x2 wnxn定義v i,j 當前揹包容量 j,前 i 個物品最佳組合對應...

動態規劃解決01揹包問題

本程式旨在利用動態規劃解決有價值的0 1揹包問題 物品的大小和價值以及揹包的大小儲存在乙個放置在e盤根目錄下的的csv檔案中 include include include include include include using namespace std int main 讀入資料的部分結束了...

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...