//思路是用店主的进出的1元为数组成员,
//收取一个一元的 数组成员为1 二元的就退一元 也就是-1
//为了这个程序有意义 请输入的m值要大于n的值
#include<stdio.h>
#include<stdlib.h>
int m,n;
int sum(int lenth,int *p)//求一个成员全是1,-1的整数数组的和
{ int i,s=0;
for(i=0;i<lenth;i++)
s=s+p[i];
if(s>=0)
return 1;
else
return 0;
}
int bol(int length,int *a)//求一个1,-1的数组是否满足条件
{int result;
if(length==1)
{
if(a[0]==1)
result=1;
else
result=0;
}
else
{
if(bol(length-1,a)&&sum(length,a))
result=1;
else
result=0;
}
return result;
}
int maxion(int x,int y)//求一个0 ,1的整数数组的最大值(当作二进制)
{int c=0,i;
for(i=1;i<=x;i++)
c=c*2+1;
for(i=1;i<=y;i++)
c=c*2;
return c;
}
int zuhe(int summ,int *a)//(把一个整数用二进制表示 0用-1来表示)
{int x,la=0;
for(x=m+n-1;x>=0;x--)
{
if(summ>0)
{
if(summ%2==1)
{a[x]=1;
la++;
}
else
a[x]=-1;
summ=summ/2;
}
else
a[x]=-1;
}
if(la==m&&bol(m+n,a))
return 1;
else
return 0;
}
void main()
{int *a;
int su,cout=0;
printf("请输入持有一元纸币的人的个数:");
scanf("%d",&m);
printf("请输入持有两元纸币的人的个数:");
scanf("%d",&n);
a=(int*)malloc((m+n)*sizeof(int));
for(su=0;su<=maxion(m,n);su++)
if(zuhe(su,a))
cout++;
printf("总共有%d种排队方法。\n",cout);
}