劍指Offer(專項突破版)---動態規劃篇
阿新 • • 發佈:2021-09-03
103. 最少的硬幣數目 [n]
給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回-1。
你可以認為每種硬幣的數量是無限的。
示例1:
輸入:coins = [1, 2, 5], amount = 11 輸出:3 解釋:11 = 5 + 5 + 1
示例 2:
輸入:coins = [2], amount = 3 輸出:-1
示例 3:
輸入:coins = [1], amount = 0 輸出:0
示例 4:
輸入:coins = [1], amount = 1 輸出:1
示例 5:
輸入:coins = [1], amount = 2 輸出:2
提示:
- 1 <= coins.length <= 12
- 1 <= coins[i] <= 231 - 1
- 0 <= amount <= 104
class Solution { public: int coinChange(vector<int>& coins, int amount) { int n = coins.size(); const int IMPOSSIBLE = amount + 1; vector<int> dp(amount + 1, IMPOSSIBLE); dp[0] = 0; for (int i = 1; i <= amount; i++) { for (int j = 0; j < n; j++) { if (i >= coins[j]) { dp[i] = min(dp[i], dp[i - coins[j]] + 1); } } } return dp[amount] > amount ? -1 : dp[amount]; } };
104. 排列的數目
給定一個由 不同正整陣列成的陣列 nums ,和一個目標整數 target 。請從 nums 中找出並返回總和為 target 的元素組合的個數。陣列中的數字可以在一次排列中出現任意次,但是順序不同的序列被視作不同的組合。
題目資料保證答案符合 32 位整數範圍。
示例 1:
輸入:nums = [1,2,3], target = 4 輸出:7 解釋: 所有可能的組合為: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1) 請注意,順序不同的序列被視作不同的組合。
示例 2:
輸入:nums = [9], target = 3 輸出:0
提示:
- 1 <= nums.length <= 200
- 1 <= nums[i] <= 1000
- nums 中的所有元素 互不相同
- 1 <= target <= 1000
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<unsigned int> dp(target + 1, 0);
dp[0] = 1;
for (int i = 1; i <= target; i++) {
for (int j = 0; j < nums.size(); j++) {
if (i >= nums[j]) {
dp[i] += dp[i - nums[j]];
}
}
}
return dp[target];
}
};