贪心算法求背包问题
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; }
相关文章推荐
- 【算法】贪心算法之背包与装箱问题
- 【算法导论】贪心算法之背包问题
- 贪心算法之阿里巴巴与四十大盗(背包问题)
- 贪心算法解决背包问题
- 贪心算法练习题:部分背包问题
- 贪心算法 - 背包问题
- 贪心算法之背包问题
- 算法分析与设计2017-2-背包问题的贪心算法
- 贪心算法运用于(0/1)背包问题
- 用贪心算法解背包问题(装载问题)
- 部分背包问题的贪心算法正确性证明
- 背包问题的贪心算法求解
- 贪心算法--背包问题
- 贪心算法之背包问题
- 背包问题的贪心算法
- 十大算法之一贪心—解背包问题-C#代码
- 贪心算法----背包问题
- 用贪心算法解背包问题Java实现
- 贪心算法解决部分背包问题 在O(lgn)时间内
- 算法学习:贪心解部分背包问题