#include<stdio.h> |
#include<stdlib.h> |
#define LIMIT 8 // 重量限制 |
#define N 5 // 物品种类 |
#define MIN 1 // 最小重量 |
/*背包问题是关于最佳化的问题,要解最佳化问题可以使用「动态规划」(Dynamic programming),从空集合开始,每增加一个元素就先求出该阶段的最佳解,直到所有的元素加入至集合中,最后得到的就是最佳解*/ |
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; 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; |
} |