贪心算法求背包问题

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;
}
原文地址:https://www.cnblogs.com/aijianiula/p/2768748.html