python代码:
from typing import List
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
Max = amount + 1
dp = [Max for _ in range(Max)]
dp[0] = 0
for i in range(1, Max):
for j in range(len(coins)):
if coins[j] <= i:
dp[i] = min(dp[i], dp[i - coins[j]] + 1)
return dp[amount] if dp[amount] < Max else -1
if __name__ == "__main__":
s = Solution()
coins, amount = [1, 2, 5], 11
res = s.coinChange(coins, amount)
print("res: ", res)
C++代码:
#include <vector>
#include <iostream>
using namespace std;
class Solution
{
public:
int coinChange(vector<int> &coins, int amount)
{
vector<int> dp(amount + 1, amount + 1); // 数组大小为 amount + 1,初始值也为 amount + 1
dp[0] = 0; // base case
for (int i = 0; i < dp.size(); i++)
{
for (int coin : coins)
{ // 内层 for 在求所有子问题 + 1 的最小值
if (i - coin < 0)
continue;
dp[i] = min(dp[i], 1 + dp[i - coin]); // 子问题无解,跳过
}
}
return (dp[amount] == amount + 1) ? -1 : dp[amount];
}
};
int main()
{
vector<int> coins = {1, 2, 5};
int amount = 11;
Solution s = *new Solution();
int res = s.coinChange(coins, amount);
printf("res: %d\n", res);
}
// 编译:g++ demo.cc -o demo
// 执行: ./demo
参考链接:动态规划(修订版)