读书人

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

发布时间: 2012-03-22 17:43:57 作者: rapoo

贪心算法背包问题(帮忙看看看)
#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;      } 

读书人网 >C语言

热点推荐