0-1 揹包問題是動態規劃中一個典型的問題。算法
給定n種物品和一個揹包,物品 i 價值 wi 和重量 vi 已知,肯定裝入揹包的物品方案,使得包內物品總價值最大。數組
設n個物品重量存儲在w[n]中,價值存儲在數組v[n]中,揹包容量位C,數組V[n+1][C+1]存放迭代結果,其中V[i][j]表示前i個物品裝入容量爲j的揹包中得到的最大價值,數組x[n]存儲裝入揹包的物品,動態規劃求解過程以下:spa
由於全部數據都是在程序運行後輸入的,因此須要動態數組來存儲。這裏使用指針來實現動態數組。指針
1 #include <stdio.h> 2 3 int KnapSack(int n,int w[],int v[]); 4 5 int *w, *v, n, C; 6 7 int main() 8 { 9 int i; 10 printf_s("請輸入揹包容量:"); 11 scanf_s("%d", &C); 12 printf_s("請輸入物品個數:"); 13 scanf_s("%d", &n); 14 15 w = new int [n]; 16 printf("請輸入物品重量:"); 17 for(i = 0; i < n; i++) 18 scanf_s("%d", &w[i]); 19 20 v = new int [n]; 21 printf("請輸入物品價值:"); 22 for(i = 0; i < n; i++) 23 scanf_s("%d", &v[i]); 24 25 printf("最優價值:%d", KnapSack(n,w,v)); 26 return 0; 27 } 28 29 30 int KnapSack(int n,int w[],int v[]) 31 { 32 int i,j; 33 34 int **V = new int*[C+1]; 35 for (i = 0; i < C+1; i++) 36 V[i] = new int[n+1]; 37 38 int *x = new int[n]; 39 for (i = 0; i <= n; i++) 40 V[i][0] = 0; 41 for (j = 0; j <= C; j++) 42 V[0][j] = 0; 43 for (i = 1; i <= n; i++) 44 for (j = 1; j <= C; j++) 45 if(j < w[i-1]) 46 V[i][j] = V[i-1][j]; 47 else 48 V[i][j] = V[i-1][j] >= (V[i-1][j-w[i-1]]+v[i-1]) ? V[i-1][j]: (V[i-1][j-w[i-1]]+v[i-1]); 49 50 j = C; 51 for (i = n; i > 0; i--) 52 { 53 if (V[i][j] > V[i-1][j]) 54 { 55 x[i-1] = 1; 56 j = j - w[i-1]; 57 } 58 else 59 x[i-1] = 0; 60 } 61 return V[n][C]; 62 }
做者:耑新新,發佈於 博客園code
轉載請註明出處,歡迎郵件交流:zhuanxinxin@foxmail.comblog