class
solution
// //不是大的取的越多越好,大的取的很多,最後不能剛好取到,比如22,陣列是10,6,你直接取兩個10肯定不行第乙個數有取1個,取0個或者取多個好幾種取法。比如18,你有10和6,那麼10乙個都不能取
// //所以要考慮的只是當前這一位可以取幾個
// for(int i = left/coins[index]; i >= 0; --i)
// }
intcoinchange
(vector<
int>
& coins,
int amount)
// for(int i = 1; i <= coins.size(); ++i)
// }
// }
// return (dp[coins.size()][amount] == inf ? -1:dp[coins.size()][amount]);
//狀壓dp
vector<
int>
dp(amount+
1,inf)
; dp[0]
=0;for
(int i =
0; i < coins.
size()
;++i)}}
return dp[amount]
== inf?-1
:dp[amount];}
// private:
// int res = int_max;
};
完全揹包,可以無限取的就是完全揹包,內部從1開始遍歷,因為這一層需要這一層前面的情況,所以先更新前面的。如果是01揹包,就要先更新後面的,因為01揹包只用到上一層的情況
class
solution
}return dp[amount]
== inf ?-1
:dp[amount];}
};
左邊的結果要更新過的,因為我們是無限取的,所以要考慮取過第i枚硬幣的情況。
dp[i][j]代表前i個元素可以組成總金額j的最少硬幣數,重點是可以重複取
class
solution
// for(int i = 1; i <= coins.size(); ++i)
// else
// }
// }
// return dp[coins.size()][amount] == 1e9 ? -1 : dp[coins.size()][amount];
//狀壓dp,只和左和上有關,但是左是要更新過的左,所以內部迴圈還是從小到大
vector<
int>
dp(amount+1,
1e9)
; dp[0]
=0;for
(int i =
1; i <= coins.
size()
;++i)
}return dp[amount]
==1e9?-
1: dp[amount];}
};
322 零錢兌換
最值問題 最優子結構特性 子問題重疊特性 使用動態規劃 狀態轉移方程 列出狀態轉移方程 步驟 1.明確狀態 原問題和子問題中變化的量 amount 連續性變化 2.定義動態規劃陣列 函式的含義 dp n 的含義 湊成n需要的硬幣個數 3.明確選擇 對於每個狀態,可以做出什麼選擇來改變當前狀態 選乙個...
322 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 coins 2 amount...
322 零錢兌換
leetcode 322 零錢兌換 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。leetcode 322 零錢兌換 官方題解 搜尋回溯 超出時間限制 動態規劃 自頂向下 動態規劃 自...