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

来源:互联网 发布:淘宝开网店技巧 编辑:程序博客网 时间:2024/05/13 17:56
贪心算法的思想:    
       贪心算法不是某种特定的算法,而是一类抽象的算法,或者说只是一种思想,它的具体表现在,对解空间进行搜索时,不是机械地搜索,而是对局部进行择优选取,贪心算法的目的不是为了找到全部解,也当然找不出最优解,而只是找出一种可行解,这样效率就比较高。因此,贪心算法也叫启发式搜索,这种启发就是所谓的 “贪心策略”。
       贪心法是一种改进了的分级处理方法。用贪心法设计算法的特点是一步一步地进行,根据某个优化测度(可能是目标函数,也可能不是目标函数),每一步上都要保证能获得局部最优解。每一步只考虑一个数据,它的选取应满足局部优化条件。若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为止。这种能够得到某种度量意义下的最优解的分级处理方法称为贪心法。
背包问题:
       已知有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调试成功,并能正常执行。
 
原创粉丝点击