基于贪心算法的0/1背包问题

贪心算法的思想:    

       贪心算法不是某种特定的算法,而是一类抽象的算法,或者说只是一种思想,它的具体表现在,对解空间进行搜索时,不是机械地搜索,而是对局部进行择优选取,贪心算法的目的不是为了找到全部解,也当然找不出最优解,而只是找出一种可行解,这样效率就比较高。因此,贪心算法也叫启发式搜索,这种启发就是所谓的 “贪心策略”。

       贪心法是一种改进了的分级处理方法。用贪心法设计算法的特点是一步一步地进行,根据某个优化测度(可能是目标函数,也可能不是目标函数),每一步上都要保证能获得局部最优解。每一步只考虑一个数据,它的选取应满足局部优化条件。若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为止。这种能够得到某种度量意义下的最优解的分级处理方法称为贪心法。

背包问题:

       已知有n个物品和一个可容纳M重量的背包,物品i的效益值为P(i),重量为W(i).假设将物体i的一部分x(i)(1<=i<=n, 0<=xi<=1)装入背包中,则有价值pi*xi。采用怎样的方法才能使所装入的物品总的效益值最大。如果从实际来看,物品一般是不能够分割的,这也就是0/1背包问题。

       基于0/1背包问题寻求最优决策。要想得到最优解,就要在效益增长和背包容量消耗两者之间寻找平衡。也就是说,总应该把那些单位效益最高的物体先放入背包。

程序实现:

        本例采用c++语言实现,单位效益值比较采用冒泡排序算法按效益值降序排列。冒泡排序在数据量比较小的时候,复杂度还是可以承受的;当数据量大的时候,可以选择归并、快速排序等算法。

       源码如下:

             #include <iostream>

             using namespace std;

              typedef struct{

                       float price;

                       float weight;

              }Data;

              class BagCupidity{

                       Data *data,*result;

                       int number; //数据个数

                       float cue;//背包容量

                       void sort();

                       int count; //counter

               public:

                       void BagPrograme();

                       BagCupidity();

                      ~BagCupidity(){  

                              delete data;

                              delete result;  

                       }

               };

              void BagCupidity::sort(){ //按效益值与重量比的降序进行排序

                       Data swap,change;

                       int j=0;

                       for(int i=0;i<number&&data!=NULL;i++){

                              swap=data[i];

                              for(j=i;j<number&&data!=NULL;j++){

                                 if((swap.price/swap.weight)<(data[j].price/(data[j].weight))){

                                      change.price=swap.price;

                                      change.weight=swap.weight;

                                      swap.price=data[j].price;

                                      swap.weight=data[j].weight;

                                      data[j].price=change.price;

                                      data[j].weight=change.weight;

                                 }

                            }           

                       }

                 }

                BagCupidity::BagCupidity(){

                        data=NULL;

                        number=0;

                        count=0;

                        cout<<“请指定背包容量”<<endl;

                        cin>>cue;

                        cout<<“准备输入多少个数据?”<<endl;

                        cin>>number;

                        data=new Data[number];

                        result=new Data[number];

                        cout<<“正在输入数据……”<<endl;

                        cout<<“依次输入物体的效益值和重量”<<endl;

                        for(;count<number;count++){

                                cin>>data->price>>data->weight;

                                ++data;

                         }

                        while(count>0){

                                –data;  //指针回退

                                –count;

                         }

                       cout<<“输入数据完成”<<endl;

               }

              void BagCupidity::BagPrograme(){

                       sort();

                       int num=0;

                       while(num<number){

                              if(data[num].weight<cue){    

                                     cue-=data[num].weight;

                                     result[count].price=data[num].price;

                                     result[count].weight=data[num].weight;

                                     ++count;

                               }

                        ++num;

                      }

                     while(count>0){

                              –count;

                              cout<<“效益值:”<<result[count].price<<“/t重量:”<< result[count].weight<<endl;

                       }

                 }

            int _tmain(int argc, _TCHAR* argv[]){

                     BagCupidity bag;

                     cout<<“结果如下”<<endl;

                     bag.BagPrograme();

                     return 0;

             }

结语:

         该程序在visual studio 2005调试成功,并能正常执行。

 

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/huankfy/article/details/1607627
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞