贪心算法背包问题(帮忙看看看)
#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;
但是你函数调用时
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]);}...
[解决办法]
#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; }