題目大概是這樣:
已知有三個容量分別為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
**:
importj**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 狀態的改...