1. 程式人生 > >動態規劃法例子     0-1揹包問題

動態規劃法例子     0-1揹包問題

/*     動態規劃法例子

    0-1揹包問題

*/ //物品個數 const int n = 5;

// 重量 int Weight[n] = {3,4,7,8,9};

// 價值 int Values[n] = {4,5,10,11,13};

// 揹包總的容量 const int W = 17;

// 分配表 int c[n+1][W+1];

int x[n+1]; // 0=表示不放,1=表示放入 void Package() {     int i,w;     int Wi,Vi;          // 第一行,第一列價值都是0     for (w = 0; w <= W; w++) c[0][w] = 0; //    for (i = 0; i <= n; i++) c[i][0] = 0;          for (i = 1; i <= n; i++)     {         c[i][0] = 0;         for (w = 1; w <= W; w++)         {             if (Weight[i-1] > w) // 一共放i個物品,此時如果第i個物品重量超過總的容量,不放第i個物品             {                 c[i][w] = c[i-1][w];             }             else   // 可以放得下第i個物品             {                     Wi = Weight[i-1];  // 第i個物品重量                 Vi = Values[i-1];  // 第i個物品價值                                  if (c[i-1][w-Wi] + Vi > c[i-1][w])                 {                     c[i][w] = c[i-1][w-Wi] + Vi;                 }                 else                     c[i][w] = c[i-1][w];             }         }     }          printf("最優值=%d\n",c[n][W]);          for (i = 0; i < n+1; i++)     {         for (w = 0; w < W+1; w++)         {             printf("%2d ",c[i][w]);         }         printf("\n");     }          w = W;     for (i = n; i > 0; i--)     {         if (c[i][w] != c[i-1][w])  // 表明第i個物品被放入         {             x[i] = 1;             w = w - Weight[i-1];         }         else         {             x[i] = 0;         }     }     printf("放入物品:\n");     for (i = 1; i <= n; i++)     {         printf("%d  ",x[i]);     } }

void main_package() {     Package(); }