zoukankan      html  css  js  c++  java
  • 贪心算法求背包问题

    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;
    }
  • 相关阅读:
    webpack的最简单应用,只使用js与css的打包
    数据统计表插件,highcharts插件的简单应用
    C#中的特性 (Attribute) 入门 (二)
    C#中的特性 (Attribute) 入门 (一)
    SQLServer存储过程入门
    C#拖拽操作
    C#剪切板
    .Net中的IO
    Android四大组件-服务
    AlertDialog对话框
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2768748.html
Copyright © 2011-2022 走看看