我们可以看到问题的答案是通过子问题的最优解得到的。
组成金额1最小硬币多少,金额2又是多少,从小一步步推大
力扣完全平方数类似这题
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int max1=amount+1;
vector<int>dp(amount+1,max1);
//最小硬币数肯定小于max1
dp[0]=0;//dp表示最小金币数量
for(int i=1;i<=amount;i++)
for(int j=0;j<coins.size();j++)
{
if(i>=coins[j])//钱要选小于等于自己面额的
dp[i]=min(dp[i],dp[i-coins[j]]+1);
//dp[11-5]+1,加1就是,这个数最后再加上5就满11,即一种方法
}
return dp[amount]>amount?-1:dp[amount];
//没有任何一种硬币组合能组成总金额,返回 -1,最坏的是全1组成}};