题目:
假设有一个背包的负重最多可达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");
}