一道很经典的问题,找到硬币组合成target值得最小形式....最基本的贪心法是不对的(可能会将有解的组合判定为无解),而搜索回溯的办法又会超时。
不妨使用动态规划,空间代价为O(amount),数组dp[i]代表对于钱数i,当前的最小组合硬币的个数。dp[i]=min(dp[i-coins[j]]+1),j为所有小于等于i的硬币且要保证dp[i-coins[j]]有解。我们不妨令dp[i]的初始值为MAX_INT,dp[0]=0.
public class Solution {
public int coinChange(int[] coins, int amount) {
Arrays.sort(coins);
int len=coins.length;
int[] dp=new int[amount+1];
Arrays.fill(dp,Integer.MAX_VALUE);
dp[0]=0;
for( int i=1;i<=amount;i++ )
{
for( int j=0;j<len;j++ )
{
if( coins[j]<=i )
{
if( dp[i-coins[j]]!=Integer.MAX_VALUE )
{
dp[i]=Math.min( dp[i-coins[j]]+1,dp[i] );
}
}
}
}
return dp[amount]==Integer.MAX_VALUE?-1:dp[amount];
}
}