有如下面值的硬幣葫辐,兌換Z元,最少需要多少枚伴郁。
[1, 2, 5] 兌換11元
定義狀態(tài) DP(n)為兌換n元時需要的最小硬幣數(shù)量
DP(n) = min(DP(n-1), DP(n-2), DP(n-5)) + 1
換成普遍的定義則為: DP(n) = min(DP(n-arr[j])) + 1
, arr為硬幣面值的組合耿战,j為硬幣面值的遍歷值.
DP[n] 即為所求。
初始值的定義:DP(0) = 0
function minCount(arr, total) {
const len = arr.length;
// 初始化保存結果的數(shù)組焊傅,長度為total+1. 并且都賦予初值total+1
let DP = new Array(total+1).fill(total+1);
DP[0]=0;
for(let i = 1; i <= total; i++) {
for(let j = 0; j < len; j++) {
// 幣值不大于兌換金額時才可兌換
if(arr[j] <= i) {
DP[i] = Math.min(DP[i], DP[i - arr[j]] + 1)
}
}
}
// DP中都賦初值為total+1, 倘若兌換金額無法正好湊出剂陡,則返回-1
return DP[total] > total ? -1 : DP[total];
}
const arr = [1,2, 5];
minCount(arr, 11);