纯C语言:贪心部分背包问题源码

来源:互联网 发布:usb hub 知乎 编辑:程序博客网 时间:2024/04/30 07:40
#include<stdio.h>struct Bag{int BagID;int BagWeight;int BagPrice;int SinglePrice;float Num;};void seekBest(Bag bag[],int n,float bagRL){int i;float BRL=bagRL;for(i=0;i<n;i++){bag[i].Num=0;if(bag[i].BagWeight>BRL)break;else{bag[i].Num=1;BRL=BRL-bag[i].BagWeight;}}if(i<=n){bag[i].Num=BRL/bag[i].BagWeight;}for(i=0;i<n;i++){if(bag[i].Num>0){printf("放入ID号为:%d  重量为  %d 的物品  %f 件!!!\n\n",bag[i].BagID,bag[i].BagWeight,bag[i].Num);}}}void Sort(Bag bag[],int n){ int j; Bag temp; int i; for(i=0;i<n;i++) {   bag[i].SinglePrice=bag[i].BagPrice/bag[i].BagWeight;   for(i=0;i<n-1;i++)   {for(j=0;j<n-i-1;j++){ if(bag[j].SinglePrice<bag[j+1].SinglePrice) {  temp=bag[j];  bag[j]=bag[j+1];  bag[j+1]=temp; }}   } }}void main(){float bagRL;Bag bag[5];bag[0].BagID=1;bag[0].BagPrice=5;bag[0].BagWeight=4;bag[0].Num=3;bag[1].BagID=2;bag[1].BagPrice=6;bag[1].BagWeight=7;bag[1].Num=2;bag[2].BagID=3;bag[2].BagPrice=7;bag[2].BagWeight=4;bag[2].Num=5;bag[3].BagID=4;bag[3].BagPrice=9;bag[3].BagWeight=3;bag[3].Num=4;bag[4].BagID=5;bag[4].BagPrice=13;bag[4].BagWeight=6;bag[4].Num=2;Sort(bag,5);printf("请输入你的背包的容量: ");scanf("%f",&bagRL);putchar(10);seekBest(bag,5,bagRL);}2#include<iostream.h>#include<malloc.h>#define N 50struct Object{int list;       //      物体的编号    float p;        //      物体的价值    float w;        //      物体的重量    float v;        //      物体的价值重量比   }; void MERGE(Object A[],int low,int mid,int high){int h,i,j,k;    Object* B=(Object*)malloc((high-low+1)*sizeof(Object));              h=low;   i=0;   j=mid+1;       while (h<=mid && j<=high)    {                 if (A[h].v>=A[j].v ){ B[i]=A[h];h=h+1 ;}                 else  { B[i] =A[j]; j=j+1 ; }   i++;                 }       if( h>mid)   {   for (k=j;k<=high;k++)   {   B[i]=A[k];   i=i+1;    }   }   else    for (k=h;k<=mid;k++)   {   B[i] =A[k];   i=i+1;   }     i=0; for (k=low;k<=high;k++)  {         A[k] =B[i] ; i++; }   free(B);}   void MERGESORT(Object array[],int low,int high)      {       int mid;   if( low<high)    {             mid=(low+high)/2;                                                    MERGESORT(array,low,mid) ;                  MERGESORT(array,mid+1,high) ;             MERGE(array,low,mid,high) ;         }          }        /****************************************************************  24.      * 求解背包问题的贪婪算法  25.      *  26.      * 输入:背包载重量M, 存放n个物体属性的数组instance[],物体个数n  27.      * 输出:n个物体被装入背包的份量x[],背包中物体的最大总价  28.      ****************************************************************/        float knapsack_greedy(float m, Object instance[], float x[], int n){   int i;   float p = 0;    //  总价值初始为0   /*      初始化     */   for(i=0; i<n; i++)   {           instance[i].v = instance[i].p / instance[i].w;  //计算物体价值重量比      x[i] = 0;                                                                      //     默认放入份量为0    }    /*      对物体进行排序:按v的递减顺序   */   MERGESORT(instance,0,n-1);   /*      填物过程  */   for(i=0; i<n; i++)   {       if(instance[i].w<=m)   {         // 若物体重量小于等于剩余载重量            x[i] = 1;           //   将物体全部装入 置x[i]为1           m -= instance[i].w; //   从剩余载重量中去掉物体的重量           p += instance[i].p; //   总价值加上物体的完整价值                  }   else{              //        若物体重量大于剩余载重量               x[i] = m / instance[i].w; //  置x[i]为剩余载重量/物体重量:即最大能置入的百分比               p+= x[i]*instance[i].p;   //  总价值加上物体装入部分的价值               break;            // 此时背包已满,可以退出循环             }             }      return p;   }                void main() {   Object instance[N];  //   n个物体的属性   float x[N];         //   n个物体装入背包的份量(0<=x[i]<=1)   float m;           //      背包的最大载重量   int n;            //        物体个数   int i;            /* 输入开始 */       cout<<"请输入背包的载重量:"; cin>>m; cout<<"请输入物体的个数:";     cin>>n; cout<<"请输入物体的价格、重量:"<<endl;       cout<<"--------------------------------------"<<endl; for(i=0; i<n; i++)   {           cout<<"第"<<(i+1)<<"件物品";     instance[i].list=i+1;         cin>>instance[i].p>>instance[i].w;         cout<<"--------------------------------------"<<endl;           }      /* 输入结束 */     /* 计算最大价值和各物体装入的重量 */       float maxv = knapsack_greedy(m, instance, x, n);          /* 输出开始 */     cout<<endl<<endl<<"可装入的最大价值是:"<<maxv<<endl;     cout<<"--------------------------------------"<<endl;     cout<<"每个物体各装入:"<<endl;     cout<<"--------------------------------------"<<endl;     for( i=0; i<n; i++) {         cout<<"第"<<instance[i].list <<"件物品";         cout<<"价值:"<<instance[i].p<<" 总量:"<<instance[i].w<<" 价值总量比:"<<instance[i].v<<" 放入数量:"<<x[i]*instance[i].w<<endl;        cout<<"--------------------------------------"<<endl;      } }

0 0