编写程序,输入一组物体重量以及它们的价值大小,对每一个物体求出它对的价值重量比,按由大到小的顺序排列,每一次取出这个比值最大且物体可以被包装下的物体,直到包装满为止。输出装入背包的物体,并给出装入物体的编号以及它们各自的价值和装入背包的物体总价值。
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct{
float p;
float w;
float v;
int order;
}OBJECT;
float x[10];
void select_sort(OBJECT *instance,int n){
int i,j;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++){
if(instance[i].v<instance[j].v){
OBJECT t=instance[i];
instance[i]=instance[j];
instance[j]=t;
}
}
}
float knapsack_greedy(float M,OBJECT instance[],float x[],int n){
int i;
float m,p=0;
for(i=0;i<n;i++){
instance[i].v=instance[i].p/instance[i].w;
x[i]=0;
}
select_sort(instance,n);
m=M;
for(i=0;i<n;i++){
if(instance[i].w<=m){
x[i]=1;
m-=instance[i].w;
p+=instance[i].p;
}
else{
x[i]=m/instance[i].w;
p+=x[i]*instance[i].p;
break;
}
}
return p;
}
void main(){
float M;
OBJECT instance[10];
cout<<"背包载重量:"<<endl;
cin>>M;
cout<<"请输入存放物体的价值和重量:"<<endl;
for(int i=0;i<5;i++){
cout<<"物品"<<i+1<<":"<<endl;
instance[i].order=i+1;
cin>>instance[i].p>>instance[i].w;
}
cout<<"背包中物品的总价值为:"<<knapsack_greedy(M,instance,x,5);
cout<<endl;
cout<<"装入的物体有:"<<endl;
for(i=0;i<5;i++){
if(x[i]!=0){
cout<<"物品"<<instance[i].order<<" 价值:"<<x[i]*instance[i].p<<endl;
}
}
}