給出的是三個容器具有不同容量(以升):分佈的水在三個容器
答:11
B:8
C:5
的問題是如何許多可能性在那裏分配13升對他們? 我試圖通過列舉他們所有的系統性蠻力,並得出了51種可能性的結果。
有沒有蠻力的另一種方式?而且我的解決方案是否正確?
在此先感謝! :d
給出的是三個容器具有不同容量(以升):分佈的水在三個容器
答:11
B:8
C:5
的問題是如何許多可能性在那裏分配13升對他們? 我試圖通過列舉他們所有的系統性蠻力,並得出了51種可能性的結果。
有沒有蠻力的另一種方式?而且我的解決方案是否正確?
在此先感謝! :d
你可以嘗試這樣的:
結合可以實現這個作爲一個簡單的遞歸算法(這裏用Python):
def divide(liters, containers):
if len(containers) == 1 and containers[0] >= liters:
yield [liters]
elif len(containers) >= 2 and liters <= sum(containers):
first, *rest = containers
for x in range(0, min(liters, first) + 1):
for remaining in divide(liters - x, rest):
yield [x] + remaining
result = list(divide(13, [11, 8, 5]))
print(len(result))
該算法也可用於三個以上的容器。不過,這可以變得更有效率。您可以使用某種形式的記憶或動態編程來減少重複計算,但對於三個容器無關緊要。
(當然,這假定水只能被劃分成一升的倍數。)
假設,
的想法是回溯
存儲在list
容器的容量。
由於沒有指定語言標記,我會用C++語言給我。組合的總數存在於answer
變量中,並且containers
使用的是存儲在result
變量中的列表列表。
int answer = 0;
vector<vector<int>> result;
void fillJug(vector<int> list, int index, int cap, vector<int> temp)
{
if(cap == 0)
{
++answer;
result.push_back(temp);
return;
}
if(cap < list[index])
{
return;
}
for(int i= index; i < list.size(); ++i)
{
vector<int> newtemp(temp);
newtemp.push_back(list[i]);
fillJug(list,i + 1,cap - list[i], newtemp);
}
}
集裝箱[5, 8, 11]
和總容量= 13的輸出將是1。 我。E)採用[5, 8]
如果容器可以使用多個時間再改
fillJug(list,i + 1,cap - list[i], newtemp);
到
fillJug(list,i,cap - list[i], newtemp);
你是什麼意思與 「暴力」 嗎?嘗試所有可能的三個容器的填充,看看他們哪些加起來13? –
是的,這是我的嘗試。 – GionSnow
這個問題太小了,以至於無法想出更智能的解決方案。只需使用兩個嵌套循環並嘗試各種可能性。 – Henry