#include<stdio.h>
#include<stdlib.h>
//用贪心思想编程实现背包问题。物品数n=5,背包容量c=10,物品重量序列w={2,2,6,5,4},物品价值序列v={6,3,5,4,6}。求最佳装包序列。
struct bagObject
{
int id;
double w;
double v;
double wv;
};
struct bagObject bag[5]={{1,2,6,0},{2,2,3,0},{3,6,5,0},{4,5,4,0},{5,4,6,0}};
double x[5]={0};//最佳装包
int n = 5;//物品数n=5
double c=10;//背包容量c=10
double function();
double function()//0,c
{ double value=0,j=c;//初始价值0,容量10
int i=0;
for(;i<n,j>0;i++){
if(j-bag[i].w>0){
value=value+bag[i].v; j=j-bag[i].w; x[bag[i].id-1]=1;
}else{
value=value+j*bag[i].wv; x[bag[i].id-1]=j/bag[i].w; return value;
}
}
return 0;
}
void main()
{
struct bagObject temp;
for(int i=0;i<n;i++){//算性价比
bag[i].wv=bag[i].w/bag[i].v;
}
/for(int i=0;i<n;i++){
printf(“物品id为:%d”,bag[i].id);
printf(“物品w为:%f”,bag[i].w);
printf(“物品v为:%f”,bag[i].v);
printf(“物品wv为:%f\n”,bag[i].wv);
}//测试1用/
for(int i=0;i<n;i++){//排序
for(int j=i;j<n;j++){
if(bag[i].wv<bag[j].wv){
temp=bag[i];
bag[i]=bag[j];
bag[j]=temp;
}
}
}
/for(int i=0;i<n;i++){
printf(“物品id为:%d”,bag[i].id);
printf(“物品w为:%f”,bag[i].w);
printf(“物品v为:%f”,bag[i].v);
printf(“物品wv为:%f\n”,bag[i].wv);
}//测试2用/
double maxValue =function();
printf(“物品装载方案如下:\n”);
for(int i=0;i<n;i++){
printf("%f\t",x[i]);
}
printf("\n最大物品价值为:%f",maxValue);
system(“pause”);
}