動態規劃法例子 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(); }