Algorithm Gossip: 背包问题(Knapsack Problem)
2015-02-02 02:59
417 查看
/**************************************** * File Name : arithmetic.c * Creat Data : 2015.2.2 * Author : ZY *****************************************/ /*Algorithm Gossip: 背包问题(Knapsack Problem)*/ /*假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重 范围内可得之总价物品,假设是水果好了,水果的编号、单价与重量 如下所示: 0 李子 4kg NT$4500 1 苹果 5kg NT$5700 2 橘子 2kg NT$2250 3 草莓 1kg NT$1100 4 甜瓜 6kg NT$6700*/ #include <stdio.h> #include <stdlib.h> #define LIMIT 8 #define N 5 #define MIN 1 struct body { char name[20];//名称 int size;//重量 int price;//价格 }; typedef struct body object; int main(void) { int item[LIMIT+1] = {0}; int value[LIMIT+1] = {0}; int newvalue,i,s,p; object a[] = {//初始化结构体 {"李子",4,4500}, {"苹果",5,5700}, {"橘子",2,2250}, {"草莓",1,1100}, {"甜瓜",6,6700} }; for(i = 0;i < N;i++) { for(s = a[i].size;s < LIMIT+1;s++) { p = s-a[i].size; newvalue = value[p]+a[i].price; if(newvalue > value[s]) { value[s] = newvalue; item[s] = i; } } } printf("物品\t价格\n"); for(i = LIMIT;i >= MIN;i = i-a[item[i]].size) { printf("%s\t%d\n",a[item[i]].name,a[item[i]].price); } printf("合计\t%d\n",value[LIMIT]); return 0; }