當乙個幣值組合用貪婪演算法不能找出最優解的時候,比如對於 1,2, 5 ,7,10。如果找14元錢的話,貪婪演算法答案是10,2,2,但最優解為7,7。
那麼利用動態規劃就能找出最優解,只是時間和空間複雜度都很高,o(nm)。
首先寫出狀態方程
| ----- f(i-1,x) , 如果v[i]>x 即當如果當前選擇的幣值大於找零的值
f(i,x)=|
| ----- min(f(i-1,x) ,f(i,x-v[i])+1) 即,從不使用第i個幣值和至少使用1個第i個幣值中選擇最小的
其實這個有點想完全揹包問題,只是揹包是選擇最大,而找零是選擇最小,對於完全揹包問題,可以看看這篇博文
只要把狀態方程寫出來,那麼程式就很容易了
public class chargemake ; //公升序排列
int charge = 142;
charge(values, charge);
} private static void charge(int values, int charge)
for (int i = 1; i < charge + 1; i++) else
} for (int i = 1; i < value + 1; i++) else
}} int mincoin = matrix[value][charge];
/** 如果最小幣值等於max,則說明當前幣值組合不能找出該零錢
*/if (mincoin == max) else
if(matrix[i][j - values[i - 1]] + 1==matrix[i][j])
else
}} }
}
硬幣找零問題(動態規劃)
給定指定的硬幣種類,面值為 1,3,5 在此具體化些 給定所找零的錢數 sum,給出最少的硬幣找零數,每個種類的硬幣無限使用。看到這問題,當時我想到用貪心演算法來求解,最後求解方案因為巧合對了,後來在網上看到動態規劃的題目,才知道貪心演算法得不到最優解,比如 給定 面值為 1,3,4,給定找零數為 ...
硬幣找零問題 動態規劃問題
看到了 這文章,由於我不太懂他的 所以我按他的題和思路,寫了 思路我就不寫了,就是動態規劃的思路,先保證區域性最優,再慢慢向全區域性最優 include include include include using namespace std const int m 100 int coinsum m...
IT筆試 動態規劃 貨幣找零問題
題目 你要出去旅遊,有n元的預算住酒店,有m家酒店供你挑選,這些酒店都有 x。需要你正好花完這n元住酒店 不能多,也不能少 最少能住幾晚?返回最少住的天數,沒有匹配的返回 1 比如你有1000元,所有酒店都是大於1000的,則返回 1 比如你有1000元,有1家1000元的,有1家300,有1家70...