首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

贪心算法背包有关问题(帮忙看看看)

2012-03-22 
贪心算法背包问题(帮忙看看看)#includestdio.h#includemath.h#define N 50intx,mvoidanalyse(intn,in

贪心算法背包问题(帮忙看看看)
#include<stdio.h>
#include<math.h>
#define N 50


int x,m;
void analyse(int n,int y,float weight[N],float price[N]) /* 将他们的价值进行排序*/
  {
  int i,j;
  int flag; /*判断*/
  float s[N],temp;
  for(i=1;i<=n;i++)
  s[i]=price[i]/weight[i];  
  for(i=1;i<=n;i++)
  {  
  flag=0;
  for(j=1;j<=n-i;j++)
  if(s[j]>s[j+1])  
  {  
  flag=1;
  temp=s[j];  
  s[j]=s[j+1];  
  s[j+1]=temp;  
   
  temp=weight[j];  
  weight[j]=weight[j+1];  
  weight[j+1]=temp;  
   
  temp=price[j];  
  price[j]=price[j+1];  
  price[j+1]=temp;  
  }  
  if(!flag) break;
  }  
  }


 void input(int n,int y,float weight[N],float price[N]) /*输入数据*/

{ int k;
  printf("输入物品种数:\n");
  scanf("%d",&n);
  printf("输入背包重量:\n");
  scanf("%1f",&y);
  printf("输入%d个物品的重量:\n",n);
for(k=1;k<=n;k++)
  scanf("%1f",&weight[k]);
  printf("输入%d个物品的价值:\n",n);
for(k=1;k<=n;k++)
  scanf("%1f",&price[k]);

}



  void find(int n,int y,float weight[N],float price[N]) /* 选择方案*/
  {  
  int i;  
  float sum=0;  
  for(i=n;i>=1;i--)
  {  
  if(sum<y)  
  {  
  if(weight[i]<=(y-sum))  
  {  
  sum=sum+weight[i];  
  printf("%d %d",&price[i],&weight[i]);
  }  
  else  
  {  
  printf("%d %d",&price[i],&weight[i]);
  break;  
  }  
  }  
  else  
  break;  
  }  
  } 


 int main()
  {  

  float w[N],p[N];


  input(x,m,w,p);
  analyse(x,m,w,p);  
  find(x,m,w,p);

  getch();
  return 0;  
  }

[解决办法]
你犯了个比较严重的错误
首先你定义了两个全局变量 int x,m;
但是你函数调用时 

C/C++ code
int  main(){     float  w[N],p[N];//  input(x,m,w,p);//用全局变量做为实际参数 这根本没有必要 //这样的做法只是将全局变量x,m的值 传递给型参n,y.在函数里修改的也是n ,y的值 //x,m的值根本不会变化//全局变量的在函数里面是能够直接访问修改全局变 你可以采用下面这种形式  input(w,p);  analyse(w,p);     find(w,p);  getch();  return   0;   }//在函数的实现里 则采用这样的形式:void input(float *w,float *p){  int k;  printf("输入物品种数:\n");  scanf("%d",&x);//x为全局变量 能够直接使用  printf("输入背包重量:\n");  scanf("%1f",&m);  printf("输入%d个物品的重量:\n",n);   for(k=1;k <=x;k++)     scanf("%1f",&weight[k]);  printf("输入%d个物品的价值:\n",n);  for(k=1;k <=x;k++)     scanf("%1f",&price[k]);}...
[解决办法]
C/C++ code
#include <stdio.h> #include <math.h> #define N 50 int  x,m; void   analyse(int   n,int   y,float   weight[N],float   price[N])     /* 将他们的价值进行排序*/   {   int   i,j;   int  flag;   /*判断*/   float   s[N],temp;   for(i=1;i <=n;i++) /* 改为for(i = 0;i < n;i++),不然越界*/   s[i]=price[i]/weight[i];      for(i=1;i <=n;i++) /* 改为for(i = 0;i < n;i++),不然越界*/   {      flag=0;   for(j=1;j <=n-i;j++)  if(s[j]>s[j+1])      {      flag=1;   temp=s[j];      s[j]=s[j+1];      s[j+1]=temp;           temp=weight[j];      weight[j]=weight[j+1];      weight[j+1]=temp;           temp=price[j];      price[j]=price[j+1];      price[j+1]=temp;      }      if(!flag)   break;   }      }  void  input(int  n,int  y,float  weight[N],float  price[N])    /*输入数据*/ {    int k;   printf("输入物品种数:\n");        scanf("%d",&n);   printf("输入背包重量:\n");        scanf("%1f",&y); /*int y应该用%d*/  printf("输入%d个物品的重量:\n",n); for(k=1;k <=n;k++) /* 改为for(k = 0;k < n;k++),不然越界*/           scanf("%1f",&weight[k]); /* %lf为double,float weight[]应该用%f */  printf("输入%d个物品的价值:\n",n); for(k=1;k <=n;k++) /* 改为for(k = 0;k < n;k++),不然越界*/            scanf("%1f",&price[k]); /* %lf为double,float price[]应该用%f */}   void   find(int  n,int  y,float  weight[N],float  price[N])  /* 选择方案*/   {      int   i;      float   sum=0;      for(i=n;i>=1;i--) /* 改为for(i = (n - 1);i > 0;i--),不然越界*/   {      if(sum <y)      {      if(weight[i] <=(y-sum))      {      sum=sum+weight[i];      printf("%d %d",&price[i],&weight[i]); /* %d 改为%f,不然输出的数据不正确 */   }      else      {       printf("%d %d",&price[i],&weight[i]); /* %d 改为%f,不然输出的数据不正确 */   break;      }      }      else      break;      }      }   int  main()   {      float  w[N],p[N];       input(x,m,w,p);           analyse(x,m,w,p);              find(x,m,w,p);   getch();   return   0;      } 

热点排行