[LeetCode] 322. Coin Change 零钱兑换
题目:
在刚看到题目时,很自然的想到了利用dfs,穷举所有的可能性,虽然知道有可能超时,但还是做了...果然超时了
随后看了题解,利用动态规划(自下而上)特别清晰
分析:
定义F(i) 表示组成i元钱需要的最小次数
那么便有,
F(0)=0
最终的目标便是求得F(amount)
不同状态之间的转移公式是 F(i) = min(F(i-Cj)) + 1, 0=<j<coins.size() 其中Cj代表硬币面值的第j个取值,如果出现i-Cj<0,直接忽略
在求F(i)时,只需知道各个F(i-Cj),而F(i-Cj)在i之前便是已知的了,所以是可以计算的
代码:
class Solution { public: int coinChange(vector<int>& coins, int amount) { vector<int> F(amount+1, amount); F[0] = 0; for(int i=1; i<=amount; i++){ int cur=INT_MAX; for(int j=0; j<coins.size(); j++){ if(i-coins[j]<0) continue; else if(F[i-coins[j]]>=0 && cur > F[i-coins[j]] ) cur = F[i-coins[j]]+1; } F[i] = cur == INT_MAX?-1:cur; } return F[amount]; } };