首页 > 代码库 > 322. Coin Change

322. Coin Change

ref: https://leetcode.com/problems/coin-change/

 

 


 

就是完全背包问题,可以再复习一遍背包问题。

 

01背包:

for 每一个item

  for amount...cost[item]

    f[v] = Max{f[v], f[v-cost[item]] + weight[item]}

因为01背包每个item只能用一次,所以amount要从后往前算,因为比较的时候用的是f[v]和f[v-cost[item]],第二个那里是减号,所以退着算,后面的结果前面没有使用

 

完全背包

for 每一个item

  for cost[item]...amout

    f[v] = Max{f[v], f[v-cost[item]] + weight[item]}

因为每一个物品可以用很多次,所以amount从小往大走,因为每一次后面的结果都用到了前面的结果。

 

如果要求满背包,就把f[0]设置为0,其他都设置为Integer.MIN_VALUE


 

下面讨论本题,本题是一个完全背包问题,coins[]就是cost[],amount就是背包的容量,要求背包刚好装满,weight是所有的item都为1

区别是传统背包问题是要求最大weight,但是本题是求最小weight,所以在初始化上有区别。dp[0] = 0, 剩下的都是Integer.MAX_VALUE

 

 1     public int coinChange(int[] coins, int amount) {
 2         if (coins.length == 0 || amount < 0) {
 3             return -1;
 4         }
 5         int[] dp = new int[amount+1];
 6         Arrays.fill(dp, Integer.MAX_VALUE);
 7         dp[0] = 0;
 8         for (int i = coins.length - 1; i >= 0; i--) {
 9             for (int j = coins[i]; j <= amount; j++) {
10                 if (dp[j - coins[i]] != Integer.MAX_VALUE) {
11                     dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
12                 }
13             }
14         }
15         return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
16     }

 

322. Coin Change