動態規劃之0-1揹包問題

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

相關文章
相關標籤/搜索