322. 零錢兌換
- dp[j] : 最小硬幣數量, j 為金額(相當于背包空間)
- 遞推公式 : dp[j] = min(dp[j - coins[i]] + 1, dp[j])
- 初始化: 需要一個最大值, 避免覆蓋, dp[0] = 0
- 遍歷順序: 錢幣有序無序不影響, 因為求解最小個數, 結果相同(先遍歷物品后背包, 先背包后物品都可)
class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, INT_MAX);dp[0] = 0;for (int i = 0; i < coins.size(); i++) {for (int j = 0; j <= amount; j++) {if (j - coins[i] >= 0 && dp[j - coins[i]] != INT_MAX) { //注意判斷條件, 防溢出dp[j] = min(dp[j - coins[i]] + 1, dp[j]);}}}if (dp[amount] == INT_MAX) return -1;return dp[amount];}
};
279.完全平方數
- dp[j] : j 的最小數量為dp[j]
- 遞推公式 : dp[j] = min(dp[j], dp[j - i * i] + 1)
- 初始化: 最大值避免覆蓋, dp[0] = 0
class Solution {
public:int numSquares(int n) {vector<int> dp(n + 1, INT_MAX);dp[0] = 0;for (int i = 1; i * i <= n; i++) {for (int j = 1; j <= n; j++) {if (j - i * i >= 0) {dp[j] = min(dp[j], dp[j - i * i] + 1);}}}return dp[n];}
};
139.單詞拆分