我審查我的講義爲我們的算法類使我開始思考這個問題:所有的解決方案,以改變與動態規劃
鑑於不同類型具有不同值的硬幣,發現所有的硬幣配置加起來達到一定數量而不重複。
在上課期間,我們解決了這個問題,找到一個總和的所有可能方法的數量和最少數量的硬幣。但是,我們從來沒有試圖找到解決方案。
我在考慮用動態規劃解決這個問題。
我帶着遞歸版本(爲簡單起見,我只打印解決方案):
void solve(vector<string>& result, string& currSoln, int index, int target, vector<int>& coins)
{
if(target < 0)
{
return;
}
if(target == 0)
{
result.push_back(currSoln);
}
for(int i = index; i < coins.size(); ++i)
{
stringstream ss;
ss << coins[i];
string newCurrSoln = currSoln + ss.str() + " ";
solve(result, newCurrSoln, i, target - coins[i], coins);
}
}
但是,試圖利用DP來解決這個問題,當我卡住了。 我有兩個主要障礙:
- 我不知道我應該用什麼數據結構來存儲以前的答案
- 我不知道我的自下而上的程序(使用循環來代替遞歸)應看起來像。
歡迎任何幫助,一些代碼將不勝感激!
謝謝你的時間。
如果您可以針對此問題使用動態編程,那麼對我來說這並不是顯而易見的。如果我找到五十分之一,則增加四分之一,然後對25分錢進行「遞歸」,找到一分之五和五分之一的鎳幣。然後我回到開始,嘗試5個鎳幣,然後檢查25cents的結果,找到2個解決方案,所以我說總共有4個解決方案。但是1季度5個鎳幣和5個鎳幣+ 1個季度是重複的。 – 2014-08-27 18:28:26
可以有多種可能的解決方案來改變製作方式,所以DP會有所幫助,但可能還需要很長時間才能完成。你還好嗎? – templatetypedef 2014-08-27 18:31:07
我寫了一個天真的版本比較:http://coliru.stacked-crooked.com/a/d2c06ff6aa2ea45a – 2014-08-27 18:55:33