用贪心算法求解普通背包问题的C++代码

 #include<iostream.h>
#define  M  100
void display(int &n,double &C,double s[M],double p[M])
{
 int i;
    cout<<“请输入物体数n:”;
    cin>>n;
    cout<<endl;
    cout<<“请输入背包总容量C:”;
    cin>>C;
    cout<<endl;
    cout<<“请输入各物体的大小或重量:”<<endl;
 s[0]=0;
    for(i=1;i<=n;i++)
  cin>>s[i];
    cout<<“请输入各物体的价值p:”<<endl;
 p[0]=0;
    for(i=1;i<=n;i++)
        cin>>p[i];
};
void asc(int n,double s[M],double p[M])//按照价值密度的降序排列;
{
 int i,j;  
    double   temp1,temp2,temp3,c[M];  
    for(i=1;i<=n;i++)  
  c[i]=p[i]/s[i];  
    for(i=1;i<n;i++)  
        for(j=1;j<=n-i;j++)  
   if(c[j]<c[j+1])  
   {
    temp1=p[j];p[j]=p[j+1];p[j+1]=temp1;  
                temp2=s[j];s[j]=s[j+1];s[j+1]=temp2;  
                temp3=c[j];c[j]=c[j+1];c[j+1]=temp3;  
   }  
};
void knapsack(int n,double C,double s[M],double p[M],double x[M])//,double totalp)
{
 int i;
 double c1;
 asc(n,s,p);
 c1=C;
 while(c1!=0)
 {
  for(i=1;i<=n;i++)
  {
   if(s[i]<=c1)
   {
    x[i]=1;
    c1=c1-s[i];
   }
   else if(s[i]>c1)
   {
    x[i]=c1/s[i];
    c1=0;
   }
  // totalp=totalp+p[i]*x[i];
  }
 }
};
void main()
{
 int i,n;
 double C=0,totalp=0,s[M],p[M],x[M];
 char ch;
 while(1)
 {
  display(n,C,s,p);
     knapsack(n,C,s,p,x);//,totalp);
        cout<<“结果表示为:”<<endl;
     for(i=1;i<=n;i++)    
      cout<<“第”<<i<<“个物体大小:”<< s[i]<<”   物体价值:”<< p[i]<<”   物体价值密度:”<< p[i]/s[i]<<”   “<<endl;
     cout<<endl;
   //  for(i=1;i<=n;i++)    
 //  cout<<“第”<<i<<“个物体价值:”<< p[i]<<”   “<<endl;
   //  cout<<endl;
     cout<<“向量表示:”<<” (   “;
        for(i=1;i<=n;i++)  
  {  
   cout<<x[i]<<”   “;
   totalp=totalp+p[i]*x[i];
  }  
        cout<<“)”<<endl;  
        cout<<“背包的总价值为:”<<totalp<<endl;     //背包所装载总重量  
        cout<<“按Y或y继续操作,否则按任意键”<<endl;
     cin>>ch;
     if(ch==’Y’||ch==’y’)
      continue;
     else
      break;
 }
}

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