贪心算法解决背包问题

来源:互联网 发布:homebrew 安装的mysql 编辑:程序博客网 时间:2024/04/29 19:15

感觉算法很简单,当练习C++了

#include <iostream>using namespace std;/*利用贪心算法解决背包问题,注意不是0-1背包问题1.按照物品单位重量的价值进行排序,然后就是从最贵的开始装,若剩下的背包空间不足以装下一个物品,那么就将该物品的部分装入*/typedef struct {    float weight;    float value;    float v_w;}Thing;void sort(Thing *&things,int n){    int flag;    float temp;    for(int i=0;i<n - 1 ;i++)    {        flag = 0;       for(int j=n-1;j > i;j--)       {           if((things+j)->v_w < (things+j-1)->v_w )           {             temp =(things+j)->v_w;             (things+j)->v_w = (things+j-1)->v_w;             (things+j-1)->v_w = temp;             flag = 1;           }       }        if (flag == 0)           break;    }}int main(){    int n;    float tempw,tempv,c;//c为容量    cout<<"请输入物品的个数:";    cin>>n;    float *x = new float[n];//为每一个物品记录该物品装入了多少1为全装进去    for(int i =0;i<n;i++){        x[i] = 0.0f;    }    Thing *things = new Thing[n];    cout<<"请输入每个物品的重量以及价值一个物品一行:"<<endl;    for(int i =0;i<n;i++){        cin>>tempw>>tempv;        (things+i)->weight = tempw;        (things+i)->value = tempv;        (things+i)->v_w = tempv/tempw;    }      sort(things,n);//按照性价比排序//    cout<<"输入完毕"<<endl;//    cout<<"共有"<<n<<"个物品,他们的重量与价值分别是:"<<endl;//    for(int i = 0;i<n;i++){//        cout<<"物品"<<i+1<<"的容量:"<<(things+i)->weight<<" 价值:"<<(things+i)->value<<" 性价比:"<<(things+i)->v_w<<endl;//    }    cout<<"请输入背包的容量:";    cin>>c;    int f;    for(f = 0;f<n;f++){        if((things+f)->weight > c) break;        x[f] = 1;        c-=(things+f)->weight;    }    if(f<n)        x[f] = c/((things+f)->weight);    for(int i = 0;i<n;i++){        cout<<"重量为"<<(things+i)->weight<<" 价值为"<<(things+i)->value<<" 的物品装入"<<x[i]<<endl;    }    return 0;}


0 0
原创粉丝点击