0
点赞
收藏
分享

微信扫一扫

【LeeCode】518. 零钱兑换 II

奋斗De奶爸 2023-01-06 阅读 123


【题目描述】

给你一个整数数组 ​​coins​​​ 表示不同面额的硬币,另给一个整数 ​​amount​​ 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 ​​0​​ 。

假设每一种面额的硬币有无限个。 

题目数据保证结果符合 32 位带符号整数。


​​https://leetcode.cn/problems/coin-change-2/​​

【示例】

【LeeCode】518. 零钱兑换 II_java

【代码】

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
}
}



举报

相关推荐

0 条评论