題目:
假設有一個揹包的負重最多可達8公斤,而希望在揹包中裝入負重範圍內可得之總價物
品,假設是水果好了,水果的編號、單價與重量如下所示:
0 李子4KG $4500
1 蘋果5KG $570
2 橘子2KG $225
3 草莓1KG $110
4 甜瓜6KG $670
思路
設有8個揹包,負重從1,2…..8. 物品編號從0,1……4.兩個循環嵌套在一起。從物品0開始,一次考慮負重1,2,到8. 然後物品1,2,到4.
每一個揹包每一次考慮放入不放入這個物品。任意重量的任意物品考慮之後的揹包都是最優解。
有兩個‘指針’,記錄當下考慮的揹包,和減去當下這輪物品重量的揹包。既,‘要不要退到某個最佳解騰出這個物品的重量,加上這個物品’
代碼
#include <stdio.h>
#include <stdlib.h>
#define MAXWEIGHT 8
#define TOTALITEMS 5
struct packItem{
char name[100];
int value;
int weight;
};
void main(){
struct packItem pck[]={{"lizi",450,4},{"Apple",570,5},{"Orange",225,2},{"Strawberry",110,1},{"Melo",670,6}};
//printf("\n%s",pck[0].name);
int items[MAXWEIGHT+1];
int values[MAXWEIGHT+1];
int tmp,tmp2;
int i,j,k;
for(k=0; k<MAXWEIGHT+1; k++){
items[k]=0;
values[k]=0;
}
i=1;
while(i<TOTALITEMS+1){
for(j=1; j<MAXWEIGHT+1; j++){
if(j<pck[i-1].weight){
continue;
}
tmp=j-pck[i-1].weight;
if(values[tmp] + pck[i-1].value >= values[j]){
values[j] = values[tmp] + pck[i-1].value;
items[j] = i;
continue;
}
else{
continue;
}
}
i++;
}
for(k=1; k<MAXWEIGHT+1; k++){
printf("\n%d", values[k]);
}
for(k=MAXWEIGHT; k>0; k=k-tmp2){
printf("\nPut%s ",pck[items[k]-1].name);
printf(" %d ",pck[items[k]-1].weight);
tmp2= pck[items[k]-1].weight;
}
system("pause");
}