首先先理解思路
不能用暴力贪心,之前的找钱是1 2 5 10之类的生活中存在的钱,现在是任意未知货币
现在如果是 1 2 5 7 10组合14就会出现问题,贪心依次是10 2 2 1,四张就不对了,应该是7 7 两张
然后就是状态转移的公式推导
dp[i]依赖条件是什么
后面那个+1很好理解,i-1 i-2 等等,表示往前查看前面位置上需要的钞票数,+1就是加上相应的 1 2 5 7 10元,就能得到当前求和,也就是加一张钞票
java(一维dp)
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp=new int[amount+1];
for(int i=0;i<=amount;i++){
dp[i]=-1;//初始值为不能到达
}
dp[0]=0;
for(int i=1;i<=amount;i++){
for(int j=0;j<coins.length;j++){
//找出i位置最少组合数目
if(i-coins[j]>=0 && dp[i-coins[j]]!=-1 ){
if(dp[i]==-1){
dp[i]=dp[i-coins[j]]+1;
}else{
dp[i]=(dp[i]>dp[i-coins[j]]+1)?dp[i]=dp[i-coins[j]]+1:dp[i];
}
}
}
}
return dp[amount];
}
}
二维dp(左程云老师在算法进阶版讲的,其实思路一样,就是换成二维,更直观)
但是我觉得不是很好理解,所以我还是坚守一维