这个算法只针对于能多次放同一种物品的情况,不能放同一种物品的算法呢?
#include <stdio.h>
#include <stdlib.h>
#define LIMIT 8 // 重量限制
int length;
typedef struct {
char name[20];
int weight;
int price;
} Fruit;
Fruit fruits[100]={0};
void knapsack(Fruit* fruits, int* values, int* items, int length, int limit, int* flags)
{
int i, w;
for(i = 0; i < length; i++)
{
for(w = fruits[i].weight; w <= limit; w++)
{
int p = w - fruits[i].weight;
int newValue = values[p] + fruits[i].price;
if(newValue > values[w])
{ // 找到階段最佳解
values[w] = newValue;
items[w] = i;
flags[i]=1;
}
}
}
}
int min(Fruit* fruits, int length)
{
int i, m;
for(i = 0, m = fruits[0].weight; i < length; i++)
{
if(fruits[i].weight < m)
{
m = fruits[i].weight;
}
}
return m;
}
int main(void)
{
while(scanf("%d",&length)!=EOF)
{
for(int i = 0; i < length; i ++)
scanf("%s %d %d",&fruits[i].name,&fruits[i].weight,&fruits[i].price);
int items[LIMIT + 1] = {0};
int values[LIMIT + 1] = {0};
int flags[length]=0;
knapsack(fruits, values, items, length, LIMIT, flags);
printf("物品\t價格\n");
int i;
for(i = LIMIT; i >= min(fruits, length); i -= fruits[items[i]].weight)
{
printf("%s\t%d\n", fruits[items[i]].name, fruits[items[i]].price);
}
printf("合計\t%d\n", values[LIMIT]);
}
system("pause");
return 0;
}