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; }