【题目描述】
给你一个整数数组 coins
表示不同面额的硬币,另给一个整数 amount
表示总金额。
请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0
。
假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。
https://leetcode.cn/problems/coin-change-2/
【示例】
【代码】
package com.company;
// 2023-1-6
import java.util.*;
class Solution {
public int change(int amount, int[] coins) {
if (coins.length == 0 || amount < 0) return -1;
// 很关键的一步,否则
int[] dp = new int[amount+1];
dp[0] = 1;
// 完全背包问题, 跟顺序无关
// 循环: 外层 coins, 内层: ammount
for (int coin : coins) {
for (int i = 1; i <= amount; i++) {
if (coin <= i){
dp[i] = dp[i] + dp[i - coin];
}
}
}
System.out.println(Arrays.toString(dp));
return dp[amount];
}
}
public class Test {
public static void main(String[] args) {
new Solution().change(5, new int[]{1, 2, 5}); // 输出: 4
new Solution().change(2, new int[]{3}); // 输出: 0
new Solution().change( 10, new int[]{10}); // 输出: 1
}
}
【代码】admin
通过 14/28 代码超时了,说真的,还得是我们【动态规划】
package com.company;
// 2023-1-6
import java.util.*;
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
public int change(int amount, int[] coins) {
if (coins.length == 0 || amount < 0) return -1;
// 很关键的一步,否则
Arrays.sort(coins);
dfs(coins, amount, 0, 0, list);
System.out.println(res);
return res.size();
}
private void dfs(int[] nums, int target, int index, int sum, LinkedList<Integer> list) {
if (sum == target){
res.add(new LinkedList<>(list));
return;
}
for (int i = index; i < nums.length && sum + nums[i] <= target; i++){
sum += nums[i];
list.add(nums[i]);
dfs(nums, target,i, sum, list);
sum -= nums[i];
list.removeLast();
}
}
}
public class Test {
public static void main(String[] args) {
new Solution().change(5, new int[]{1, 2, 5}); // 输出: 4
new Solution().change(2, new int[]{3}); // 输出: 0
new Solution().change( 10, new int[]{10}); // 输出: 1
}
}