题目:零钱兑换
确定状态:dp[ i ]代表 为了凑出 i 元,所需要的硬币数量
状态转移:dp[ i ] = min(dp[ i ], dp[ i - coin ] + 1),即金额 i 的最优解,必然是由某个较小的金额 i - coin 转移而来的。
1int coinChange(vector<int>& coins, int amount)
2{
3 std::vector<int> dp(amount + 1, amount + 1);
4 dp[0] = 0;
5
6 for(int i = 1; i <= amount; i++)
7 {
8 for(auto coin :coins)
9 {
10 if(coin <= i)
11 dp[i] = std::min(dp[i], dp[i - coin] + 1);
12 }
13 }
14 return dp[amount] > amount ? -1 : dp[amount];
15}