您的位置:首页 > 其它

贪心算法求背包问题

2012-11-13 20:45 543 查看
View Code

#include<iostream>
using namespace std;
struct Object{
float w;
float v;
float w_v;
int order;    //物品的序号
float x;//是否放入背包,整个放入是1,一部分放入是放入的部分与总的比值,没放入为0
};
Object object[100];
int compare( const void *a , const void *b )
{
Object *aa=(Object *)a;
Object *bb=(Object *)b;
return ((bb->w_v)-(aa->w_v));
}
void Knapsack(int n,float M,Object object[]){
qsort(object,n,sizeof(Object),compare);//降序排序
int i;
for(i=0;i<n;i++) object[i].x=0;
float c=M;
for(i=0;i<n;i++){
if(object[i].w>c) break;
object[i].x=1;
c-=object[i].w;
}
if(i<n) object[i].x=c/object[i].w;//最后一个未能全部装进背包,值装一部分
}
int main(){
int n;
int x[100];//用来记录物品放入背包的状态
float c,w[100],v[100],value[100],sum=0;
cout<<"物品数量n:";
cin>>n;
cout<<"背包最大能承载的重量:";
cin>>c;
for(int i=0;i<n;i++){
cout<<"第"<<i+1<<"个物品的重量和价值:";
cin>>object[i].w>>object[i].v;
object[i].w_v=object[i].v/object[i].w;
object[i].order=i+1;
object[i].x=0;
}
Knapsack(n,c,object);

cout<<"各物品单位重量价值排序后为:"<<endl;
for(int i=0;i<n;i++)
cout<<object[i].order<<" :"<<object[i].w_v<<endl;

cout<<"放入背包的物品是:"<<endl;
for(int i=0;i<n;i++){
if(object[i].x>0){
if(object[i].x==1){
sum+=object[i].v;
cout<<object[i].order<<" ";//输出装入背包的物品序号
}
else{
cout<<i+1<<endl;
sum+=object[i].x*object[i].v;
cout<<"其中第"<<i+1<<"个物品放入其重量的:"<<object[i].x<<"="<<object[i].x*object[i].w<<endl;
}

}
}
cout<<"装入背包的总质量是:"<<sum<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: