/*背包問題: 背包所能容納重量為10;共五件商品,商品重量用數組m存儲m[5]={2,2,6,5,4}, 每件商品的價值用數組n存儲,n[5]={6,3,5,4,6};求背包所能裝物品的最大價值。 */ #include<stdio.h> #include<conio.h> int main() { int m[5] = { 2,2,6,5,4 }, n[5] = { 6,3,5,4,6 }; int flag[5] = { 0,0,0,0,0 };//符號標志位,表示地某個點是否裝入背包,裝入為1,未裝入為0; int i, j, k; int c = 10, sum1 = 0, sum2 = 0;//sum1表示最終背包容納的重量。sum2表示最終背包中容納的最大價值的價值。 //設一個二維數組,橫坐標表示所裝物品的標號,縱坐標表示背包所容納的最大重量0~10; int mn[5][11]; for (i = 4; i >= 0; i--) {//二維數組從下至上 for (j = 0; j <= 10; j++) { if (i == 4) { if (m[i]>j) mn[i][j] = 0; else mn[i][j] = n[i]; } else { if (m[i]>j) { mn[i][j] = mn[i + 1][j]; } else { mn[i][j] = mn[i + 1][j]>mn[i + 1][j - m[i]] + n[i] ? mn[i + 1][j] : mn[i + 1][j - m[i]] + n[i]; } } } } for (i = 0; i<5; i++) { if (mn[i][c] != mn[i + 1][c]) {//從二維數組上方開始,背包最大值c,mn[i][c]的值若與mn[i+1][c]的值不同,則m[i]未放入背包中(之前是自下往上放的) flag[i] = 1; c = c - m[i];//若放入背包,則背包可容納總重量減少; } printf("%d ", flag[i]); }//輸出所放入的物品序號 for (i = 0; i<5; i++) { if (flag[i] == 1) { sum1 += m[i]; sum2 += n[i]; } } printf("\n背包容納的重量為:%d 背包容納的總價值為:%d", sum1, sum2); getch(); return 0; }