文章目录
322. 零钱兑换(120)
代码实现(首刷自解)
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int n = coins.size();
vector<int> dp(amount + 1, 10001);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < n; j++) {
if (i - coins[j] >= 0 && dp[i - coins[j]] != 10001)
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
return dp[amount] == 10001 ? -1 : dp[amount];
}
};
518. 零钱兑换 II(121)
代码实现(看题解)
考虑硬币组合的顺序,达到去重的效果
class Solution {
public:
int change(int amount, vector<int>& coins) {
int n = coins.size();
vector<int> dp(amount + 1, 0);
dp[0] = 1;
for (int coin : coins) {
for (int i = coin; i <= amount; i++) {
dp[i] += dp[i - coin];
}
}
return dp[amount];
}
};
377. 组合总和 Ⅳ(122)
代码实现(首刷自解)
class Solution {
public:
int combinationSum4(vector<int>& coins, int amount) {
int n = coins.size();
vector<unsigned int> dp(amount + 1, 0);
dp[0] = 1;
for (int i = 1; i <= amount; i++) {
for (int coin : coins) {
if (i - coin >= 0) {
dp[i] += dp[i - coin];
}
}
}
return dp[amount];
}
};
343. 整数拆分(123)
代码实现(首刷自解)
class Solution {
public:
int integerBreak(int n) {
if (n <= 3) return n - 1;
vector<int> dp(n + 1, 0);
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
for (int i = 4; i <= n; i++) {
for (int j = 1; j <= i / 2; j++) {
dp[i] = max(dp[i - j] * dp[j], dp[i]);
}
}
return dp[n];
}
};
279. 完全平方数(124)
代码实现(首刷自解)
class Solution {
public:
int numSquares(int n) {
vector<int> coins;
for (int i = 1; i <= sqrt(n); i++) {
coins.push_back(i * i);
}
int amount = n;
int m = coins.size();
vector<int> dp(amount + 1, 10001);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < m; j++) {
if (i - coins[j] >= 0 && dp[i - coins[j]] != 10001)
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
return dp[amount] == 10001 ? -1 : dp[amount];
}
};