LC322 - 硬币兑换

这道题类似背包问题,取或不取,也可取多个,可以用自底向上的动态规划解决,首先可以将递归式列出。

F(0) = 0;
F(n) = Min{F(n - a[0]), F(n - a[1]), F(n - a[2]), ... F(n - a[a.length - 1])} + 1;
其中a为硬币数组。

代码如下:

class Solution {
    public int coinChange(int[] coins, int amount) {
        if(coins.length == 0 || coins == null) return -1;
        int[] dp = new int[amount+1];
        dp[0] = 0;
        for(int i=1; i<=amount; i++){
            int minCount = Integer.MAX_VALUE;
            for(int j=0; j<coins.length; j++){
                if(i >= coins[j] && dp[i - coins[j]] != -1){
                    minCount = Math.min(dp[i - coins[j]] + 1, minCount);
                }
            }
            if(minCount == Integer.MAX_VALUE){
                dp[i] = -1;
            }else {
                dp[i] = minCount;
            }
        }
        return dp[amount];
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
09-02 11:14
已编辑
四川大学 Java
吴offer选手:这种面试是最烦的,学不到东西,然后还被挂的莫名其妙。之前看到一种说法是面试官如果不想要你了,就会问一些很简单的问题,防止你举报他
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务