分酒問題(DFS解法)

2022-09-07 15:12:31 字數 2174 閱讀 4297

題目大概是這樣:

已知有三個容量分別為3千克、5千克和8千克的並且是沒有刻度的酒瓶,3千克和5千克的瓶子均裝滿了酒,而8千克的瓶子為空。現要求僅用這三個酒瓶將這些酒均分為兩個4千克並分別裝入5千克和8千克的瓶子中。

題解:可以擴充套件為有n個瓶子,每個瓶子當前裝了x1,x2,x3…xn的酒,每個瓶子的上限是y1,y2,…yn,目標狀態是每個瓶子d1,d2,…dn,現在要從當前狀態轉換到目標狀態

可以解讀到,每個瓶子只有兩種狀態--要麼盛滿,要麼空

所以當酒從x瓶子轉移到y瓶的時候,只有可能是試圖將酒全部到入y瓶中,這樣會造成兩種結果:

能盛得下-- x瓶空,y瓶的酒為原來的酒加上x瓶原來的酒。

盛不下-- x瓶的酒為原來的酒減去倒過去的那部分, y瓶滿。

很顯然,如果要求最短的步數,bfs是乙個比較簡單的辦法,現在想輸出所有的路徑,所以考慮dfs

**:

import

j**a.util.arraylist;

import

j**a.util.linkedlist;

import

j**a.util.queue;

import

j**a.util.scanner;

//已知有3個容量分別為3kg,5kg和8kg且沒有刻度的酒瓶3kg和5kg的瓶子均裝滿了酒。而8kg的瓶子為空。

//現要求僅用這3個酒瓶將這些酒均分為兩個4kg,並分別裝入5kg和8kg的瓶子中。

public

class

dispensingproblem

string temps= new

string[states.size()];

for(int ll = 0;ll)

temps[ll] =states.get(ll);

paths.add(temps);

minnum =n;

}system.out.println("第"+casenum+"種方法:");

for(int l=0;l)

system.out.println(states.get(l));

system.out.println("總共需要移動"+n+"步");

system.out.println("------------------------------------");

return

; }

//找出當前可能的所有移動

//資料不大,不需要優化

//每個瓶子只能倒滿或者倒空

//注意要標註每一種狀態,防止狀態重複

for(int i = 0 ; i < n;i++)

for(int j = 0; j < n ;j++)

//回溯

bottlecurrent[i] =ni;

bottlecurrent[j] =nj;

}else

//回溯

bottlecurrent[i] =ni;

bottlecurrent[j] =nj;}}

//找遍所有狀態都不可行,則表明不能出現這種狀態

"不可能存在這種狀態!");

}

public

static

void

main(string args)

system.out.println("請輸入每個瓶子當前有多少酒");

for(int i = 0 ;i < n; i ++)

system.out.println("請輸入最終希望每個瓶子有多少酒");

for(int i = 0 ;i < n; i ++)

string s = string.valueof(bottlecurrent[0]);

for(int i =1;i)

s+=string.valueof(bottlecurrent[i]);

states.add(s);

dfs(0);

system.out.println("******************************");

system.out.println("最少需要"+minnum+"步");

int index = 0;

for(int i = 0;i)

system.out.println("******************************");

}}

海盜分酒(數學問題)

海盜分酒 題目描述 有一群海盜 不多於 20人 在船上比拼酒量。過程如下 開啟一瓶酒,所有在場的人平分喝下,有幾個人倒下了。再開啟一瓶酒平分,又有倒下的,再次重複 直到開了第 4瓶酒,坐著的已經所剩無幾,海盜船長也在其中。當第 4瓶酒平分喝下後,大家都倒下了。等船長醒來,發現海盜船擱淺了。他在航海日...

java實現分酒(泊松分酒)

寫在前面 泊松分酒 法國著名數學家波瓦松在青年時代研究過乙個有趣的數學問題 假設某人有12品脫的啤酒一瓶,想從中倒出六品脫,但是恰巧身邊沒有6品脫的容器,僅有乙個8品脫和乙個5品脫的容器,怎樣倒才能將啤酒分為兩個6品脫呢?現在,請你設計乙個程式,可以根據輸入的滿瓶容量 a 和兩個空瓶的容量 b和c ...

回溯 四人分酒問題

題目 兩瓶 8兩的酒,乙個 3兩的杯子,瓶和杯子都沒有刻度,如何將酒平均分給四個人喝?也就是每個人分 4兩酒,也沒什麼限制條件,當然,喝過的酒不能再吐出來 思路 回溯演算法,遞迴 對當前酒瓶,杯和人當前存的酒量設定為一種狀態,最初始的狀態為 880 0000 最終的狀態為 000 4444 狀態的改...