hloj 168「倒牛奶」解題討論

2022-05-13 19:45:19 字數 2584 閱讀 5931

農民約翰有三個容量分別是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
1 1 2 8 9 10 

樣例輸出 2

2 5 6 7 8 9 10

時間限制:1

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...