農民約翰有三個容量分別是a,b,c公升的桶,a,b,c分別是三個從1到20的整數。 最初,a和b桶都是空的,而c桶是裝滿牛奶的。有時,約翰把牛奶從乙個桶倒到另乙個桶中,直到被灌桶裝滿或原桶空了。當然每一次灌注都是完全的。由於節約,牛奶不會有丟失。 寫乙個程式去幫助約翰找出當a桶是空的時候,c桶中牛奶所剩量的所有可能性。
單獨的一行包括三個整數a,b和c。
只有一行,公升序地列出當a桶是空的時候,c桶牛奶所剩量的所有可能性。
input
樣例輸入 1
8 9 10
樣例輸入 2
2 2 5 10
output
樣例輸出 1
時間限制:11 1 2 8 9 10
樣例輸出 2
2 5 6 7 8 9 10
s'>1s
空間限制:256
mb'>256mb
這是一道較為水坑的題(水是重點!)。
首先分析一下題目,題目的意思是這樣的:最初,a和b桶都是空的,而c桶是裝滿牛奶的。要找出當a桶是空的時候,c桶中牛奶所剩量的所有可能性。
咋眼一看,感覺有點懵,這什麼鬼啊!
再看一下題目所給的資料:1********************===我是分割線********************==
讀完了以上廢話,下面引入正題:
看一下這道題的樣例:
輸入樣例:
sample input 1
8 9 10
sample input 2
2 5 10
輸出樣例:
sample output 1
1 2 8 9 10
sample output 2
5 6 7 8 9 10
樣例還是給的比較良心的,讓我們知道得出結果的同時還要sort排序一下(差點掉坑)。
接下來高能來襲:
仔細思考一下,如果我們要用遞迴來寫這道題,是不是應該把所有情況列舉出來,對吧!
好的,那麼我們想一下:
假設a中有牛奶,那麼為了列舉所有的情況,它只有兩種選擇
1.把牛奶倒入b 2.把牛奶倒入c。
那麼問題來了,有可能牛奶倒入b倒滿了,a中還有剩餘。或者牛奶倒入b沒有倒滿,a中牛奶空了。
這兩種狀態是不一樣的!!!!(同理a倒c)
分析一下這兩種狀態,可以寫出a倒b的遞迴轉移式:
//milk表示遞迴函式;a,b,c表示三個桶中的牛奶剩餘量,a,b,c表示三個桶的容積。 b桶還未滿。
//a桶中的牛奶剩餘量為(a-(b-b)),b-b為b桶中剩餘的容積。此時b桶已經滿了。
同理可得a倒c,a倒b,b倒c,b倒a(與a倒b為兩種不同的情況,容易混淆),c倒a(與a倒c不同),c倒b(與b倒c不同)。。
********************我是分割線******************************=
遞迴要配合記憶化搜尋,記住,遞迴要配合記憶化搜尋。
注意要判斷當前狀態是否存在過。用f[a][b][c]來表示三個桶的狀態
下面貼一下**
#includeusing namespace std;
int sum[50];//sum[i]表示可能的種數
int a,b,c,p=-1; //a,b,c表示三個桶的容積
bool f[50][50][50];
void milk(int a, int b, int c)//a,b,c表示三個桶中的牛奶量
if(a<=b-b) milk(0,a+b,c);//如果a桶中的牛奶少於b桶剩餘的容積,則倒入。
else milk(a-(b-b),b,c); //否則a桶剩餘繼續倒,把b桶倒滿。
if(a<=c-c) milk(0,b,c+a);// 同理列舉a倒c。
else milk(a-(c-c),b,c);
if(b<=a-a) milk(a+b,0,c);
else milk(a,b-(a-a),c);
if(b<=c-c) milk(a,0,c+b);
else milk(a,b-(a-a),c);
if(c<=a-a) milk(a+c,b, 0);
else milk(a,b,c-(a-a));
if(c<=b-b) milk(a,b+c, 0);
else milk(a,b,c-(b-b)); //依次列舉a,b,c桶分別有牛奶的情況,以及分別倒入另外兩桶的情況全部列舉。
return;
} int main()
{ memset(sum,0,sizeof(sum));
memset(f,0,sizeof(f));
cin>>a>>b>>c;
milk(0,0,c);//表示初始狀態遞迴
sort(sum,sum+p+1);//從把結果小到大排序
for(int i=0;i;i++){
cout<[i]<<
HLOJ430 構建雙塔
用一些有固定高度的方塊堆成兩座相同高度的塔,問塔最高高度。雙程序dp f j k 代表一 個塔高度 為j,另 乙個塔高 度為k的 情況是否 存在f j k 代表乙個 塔高度為 j,另一 個塔高度 為k的情 況是否存 在我們可以輕易得出 f j k f j a i k f j k a i f j k ...
HLOJ 483 光棍組織
題目描述 mm 雖然一輩子只要乙個,但是也得早點解決。於是,n 個光棍們自發組成了乙個光棍組織 ruffian organization,by wind 亂譯 現在,光棍們打算分成幾個小組,並且分頭為 找 mm 事 業做貢獻 for example searching,hunting by wind...
NYOJ 房間安排168
房間安排 時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述2010年上海世界博覽會 expo2010 是第41屆世界博覽會。於2010年5月1日至10月31日期間,在中國上海市舉行。本次世博會也是由中國舉辦的首屆世界博覽會。上海世博會以 城市,讓生活更美好 better cit...