此题总共3个桶,a可以倒到b也可以倒到c,同理b倒c,b倒a;c倒a,c倒b;
根据这几种情况dfs,用数组存下答案和出现的情况。
#include<iostream>
#include<cstdio>
using namespace std;
int a,b,c;
int ans[30];
int f[30][30][30];
void dfs(int x,int y,int z)
{
if(f[x][y][z]) return ;
if(x==0) ans[z]=1;
f[x][y][z]=1;
if(z)
{
if(x<a) dfs(min(a,x+z),y,z-min(a,x+z)+x);
if(y<b) dfs(x,min(b,z+y),z-min(b,y+z)+y);
}
if(y)
{
if(x<a) dfs(min(a,y+x),y-min(a,y+x)+x,z);
if(z<c) dfs(x,y-min(c,y+z)+z,min(c,y+z));
}
if(x)
{
if(y<b) dfs(x-min(b,y+x)+y,min(b,y+x),z);
if(z<c) dfs(x-min(c,z+x)+z,y,min(c,x+z));
}
}
int main()
{
cin>>a>>b>>c;
dfs(0,0,c);
for(int i=0;i<=c;i++)
if(ans[i]) cout<<i<<" ";
return 0;
}