动态规划的问题,
从1开始排列 生成一个新数组来记录组合该下标所需的最小硬币的数目一直计算到amount即可
动态方程为F[i]=min(F[i],F[i-coins[j]]+1)
比如要组成11 有硬币选择 1 2 5
可以返回上一步11-1 11-2 11-5 他们中组成的最小硬币数再+1即可
可以先画一下递归树
是从1开始记录生成当前下标所需的最少的硬币数目,别理解错了,自下向上去得到下标amount对应的值,即为所求的结果。
代码如下:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int max=amount+1;
vector<int> dp(max,max);
dp[0]=0;
for(int i=1;i<=amount;i++){
for(int j=0;j<coins.size();j++){
if(coins[j]<=i){
dp[i]=min(dp[i],dp[i-coins[j]]+1);
}
}
}
return dp[amount]>amount?-1:dp[amount];
}
};