1.4.4 Mother's Mil 母亲的牛奶
时间: 1ms 内存:64M
描述:
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的。有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入:
单独的一行包括三个整数A,B和C。
输出:
只有一行,列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
示例输入:
8 9 10
示例输出:
1 2 8 9 10
提示:
参考答案(内存最优[856]):
#include<stdio.h>
int s[30][30][30]={0},aa,bb,c;
int ans[30]={0};
void check(int ac,int bc,int cc)
{
if(s[ac][bc][cc])return ;
s[ac][bc][cc]=1;
if(ac>bb-bc) //A倒入B
check(ac+bc-bb,bb,cc);
else
check(0,bc+ac,cc);
if(ac>c-cc) //A倒入C
check(ac-c+cc,bc,c);
else
check(0,bc,cc+ac);
if(bc>c-cc) //B倒入C
check(ac,bc-c+cc,c);
else
check(ac,0,cc+bc);
if(bc>aa-ac) //B倒入A
check(aa,bc-aa+ac,cc);
else
check(ac+bc,0,cc);
if(cc>aa-ac) //C倒入A
check(aa,bc,cc-aa+ac);
else
check(ac+cc,bc,0);
if(cc>bb-bc) //C倒入B
check(ac,bb,cc-bb+bc);
else
check(ac,bc+cc,0);
return ;
}
int main()
{
int i,j,flag;
scanf("%d %d %d",&aa,&bb,&c);
check(0,0,c);
flag=1;
for(i=0;i<=bb;i++)
{
for(j=0;j<=c;j++)
{
if(s[0][i][j])ans[j]=1;
}
}
for(i=0;i<30;i++)
{
if(ans[i]&&flag)
{
printf("%d",i);
flag=0;
}
else if(ans[i])printf(" %d",i);
}
printf("\n");
return 0;
}
参考答案(时间最优[3]):
#include<stdio.h>
int s[30][30][30]={0},aa,bb,c;
int ans[30]={0};
void check(int ac,int bc,int cc)
{
if(s[ac][bc][cc])return ;
s[ac][bc][cc]=1;
if(ac>bb-bc) //A倒入B
check(ac+bc-bb,bb,cc);
else
check(0,bc+ac,cc);
if(ac>c-cc) //A倒入C
check(ac-c+cc,bc,c);
else
check(0,bc,cc+ac);
if(bc>c-cc) //B倒入C
check(ac,bc-c+cc,c);
else
check(ac,0,cc+bc);
if(bc>aa-ac) //B倒入A
check(aa,bc-aa+ac,cc);
else
check(ac+bc,0,cc);
if(cc>aa-ac) //C倒入A
check(aa,bc,cc-aa+ac);
else
check(ac+cc,bc,0);
if(cc>bb-bc) //C倒入B
check(ac,bb,cc-bb+bc);
else
check(ac,bc+cc,0);
return ;
}
int main()
{
int i,j,flag;
scanf("%d %d %d",&aa,&bb,&c);
check(0,0,c);
flag=1;
for(i=0;i<=bb;i++)
{
for(j=0;j<=c;j++)
{
if(s[0][i][j])ans[j]=1;
}
}
for(i=0;i<30;i++)
{
if(ans[i]&&flag)
{
printf("%d",i);
flag=0;
}
else if(ans[i])printf(" %d",i);
}
printf("\n");
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。