-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCoinChange.java
More file actions
60 lines (58 loc) · 2.01 KB
/
Copy pathCoinChange.java
File metadata and controls
60 lines (58 loc) · 2.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.util.Arrays;
/**
* @author li_zhe
* 解题思路来自leetcode,用类完全背包解有问题,没想明白
* DP思想,dp[i]表示价格为i需要最少的coin数,则状态转移方程:dp[i] = min(dp[i], dp[i - coins[j]] + 1)
*/
public class CoinChange {
//迭代
public int coinChange(int[] coins, int amount) {
if(amount == 0) return 0;
if(coins == null || coins.length == 0) return -1;
int[] price = new int[amount + 1];
Arrays.fill(price, Integer.MAX_VALUE - 1);
price[0] = 0;
for(int i = 1; i <= amount; i++){
for(int j = 0; j < coins.length; j++){
if(i >= coins[j]){
price[i] = Math.min(price[i], price[i - coins[j]] + 1);
}
}
}
return price[amount] == Integer.MAX_VALUE - 1 ? -1 : price[amount];
}
// 递归
public int coinChange1(int[] coins, int amount) {
if(amount < 1) return 0;
return coin(coins, amount, new int[amount]);
}
private int coin(int[] coins, int left, int[] price){
if(left < 0) return -1;
if(left == 0) return 0;
if(price[left - 1] != 0) return price[left - 1];
int min = Integer.MAX_VALUE;
for(int i = 0; i < coins.length; i++){
if(left >= coins[i]){
int res = coin(coins, left - coins[i], price);
if(res >= 0 && res < min)
min = res + 1;
}
}
price[left - 1] = min == Integer.MAX_VALUE ? -1 : min;
return price[left - 1];
}
public static void main(String[] args) {
CoinChange coin = new CoinChange();
System.out.println(coin.coinChange(new int[]{1,2,5}, 11));
System.out.println(coin.coinChange(new int[]{1,2,5}, 1));
System.out.println(coin.coinChange(new int[]{1,2,5}, 2));
System.out.println(coin.coinChange(new int[]{1,2,5}, 5));
System.out.println(coin.coinChange(new int[]{1,2,5}, 8));
System.out.println(coin.coinChange(new int[]{1,2,5}, 100));
System.out.println(coin.coinChange(new int[]{2}, 2));
System.out.println(coin.coinChange(new int[]{2}, 3));
System.out.println(coin.coinChange(new int[]{2}, 11));
System.out.println(coin.coinChange(new int[]{1}, 0));
System.out.println(coin.coinChange(new int[]{186,419,83,408}, 6249));
}
}