问题:有两个没有刻度的8两的酒瓶和一个可以没有刻度的3两的酒杯,现在有16两酒要平均分给4个人喝,怎么分配?
这个问题网上有很多人讨论过,我看过一篇文章写出了比较具体的C程序,但十分繁复。我对这个问题做了简单的思考写出了一个简单的程序,这个程序只能产生分配方法中的几种解法,但非常轻易理解。
源程序如下:
#include"stdio.h"
int a,b,c,d,x,y,v,j;
void show()
{
printf("甲 %d,乙 %d,丙 %d,丁 %d,瓶一 %d,瓶二 %d,酒杯 %d→第%d步。\n",a,b,c,d,x,y,v,j);
j++;
}
void make()
{
v=0;
x=3;
show();
v=3;
y=y-3;
show();
v=0;
x=6;
show();
y=y-3;
v=3;
show();
x=8;
v=1;
show();
}
void assign()
{
x=x-3;
v=v+3;
show();
a=a+3;
v=v-3;
show();
x=x-3;
v=v+3;
show();
d=x;
x=0;
show();
}
void main()
{
int i;
j=1;
a=b=c=d=v=i=0;
x=y=8;
show();
assign();
while(x=0,x+y+v>8)
{
make();
i=i+1;
v=0;
if(i=1)
{
a=4;
}
if(i=2)
{
b=1;
}
if(i=3)
{
c=1;
}
show();
v=3;
y=y+(x-3);
x=0;
show();
if(x+y+v<=8)
break;
}
b=b+v;
v=0;
show();
y=y-3;
v=v+3;
show();
c=c+v;
v=0;
show();
d=d+y;
y=0;
show();
}
由于VC++6.0在编写源程序时十分方便,所以我即使写C程序也习惯使用VC++6.0,这个程序是在VC++6.0上运行通过。
这个简单的算法是循环产生1两酒,因为只要产生1两的情况,那些就十分轻易分配了。
谁有更简单又能产生更多分配情况的好程序请贴出来,让大家分享一下!谢谢。