7月26日:零钱兑换

题目如下:

7月26日:零钱兑换

题目要求凑成总金额所需的最少的银币个数。当看到硬币个数最少时,我的大脑立马出现了条件反射。这不是要用动态规划来解题嘛(机智如我)。可是想了一会儿还是想不到状态转移方程。

只好默默的打开题解,感觉题解的思路总是那么晦涩难懂,看着看着我就没了耐心,于是我开始看代码,通过看代码我感觉比看题解思路要容易理解,毕竟题解思路是别人的想法,想将别人的想法理解为自己的东西还是不太容易的,但是代码却是实实在在的东西。然后看代码看懂了就立马开始自己写一遍。一开始写完感觉差不多了,可是运行完成后答案总是0,搞不懂为什么,然后又重新和题解的代码进行对比,发现完全一样,只是变量名不一样。正当我很郁闷的时候突然手一抖,leetcode窗口就自己关闭了,再当我打开时候刚刚写的代码没有了,所以只好重新写一遍了,第二遍写完时提交通过了,真是一件很神奇的事儿。

下面是我的代码:

class Solution {

    public int coinChange(int[] coins, int amount) {

       if(coins.length==0)return -1;

//定义状态数组,存放的是当前金额对应的最小硬币数量

       int[] dp = new int[amount+1];

       for(int i=1;i<=amount;i++){

           int min = Integer.MAX_VALUE;

           for(int j=0;j<coins.length;j++){

               if(i-coins[j]>=0&&dp[i-coins[j]]<min)

                    min = dp[i-coins[j]]+1;

           }

           dp[i] = min;

       }

       return dp[amount]==Integer.MAX_VALUE?-1:dp[amount];

    }

}