我们让一个实习生用自上而下的方法解决最小硬币问题。问题陈述给出了一组硬币,返回构成总和所需的最小硬币。此外,还应返还构成金额的硬币。
Eg: coins = {7, 3, 2, 6}, total = 13,
result should be minCoins = {2}, coinsUsed = {7,6}
这是密码
package dp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MinimumCoin {
public static void main(String[] args) {
int total = 13;
int coins[] = {7, 3, 2, 6};
Result rs = minCoin(coins, total, new HashMap<>());
System.out.println(rs.min);
System.out.println(rs.coins);
}
public static Result minCoin(int[] coins, int total, Map<Integer, Result> memo) {
if (total == 0) {
return new Result();
}
if (memo.containsKey(total)) {
return memo.get(total);
}
int min = Integer.MAX_VALUE;
List<Integer> coinsSoFar = new ArrayList<>();
for (int i = 0; i<coins.length; i++) {
if (coins[i] > total) {
continue;
}
Result rs = minCoin(coins, total-coins[i], memo);
coinsSoFar.add(coins[i]);
if (rs.min > min) {
min = rs.min;
coinsSoFar.addAll(rs.coins);
}
else {
coinsSoFar.remove(coinsSoFar.size()-1);
}
}
min = (min == Integer.MAX_VALUE ? min : min + 1);
Result rs = new Result(min, coinsSoFar);
memo.put(total, rs);
return rs;
}
public static class Result {
private int min;
private List<Integer> coins = new ArrayList<>();
private Result() {}
private Result(int min, List<Integer> coins) {
this.min = min;
this.coins = coins;
}
}
}
代码在大部分情况下看起来不错。但不会返回预期的结果。当使用上述输入执行时,程序返回INT.MAX作为minCoins,列表为空。
有关于代码哪里出错的提示吗?谢谢
那么,您将min
初始化为整数。最大值
,然后具有以下代码:
if (rs.min > min) {
min = rs.min;
coinsSoFar.addAll(rs.coins);
}
如您所见,rs.min
是一个int
,并且永远不会大于min
(也就是整数。MAX_VALUE
)。
您更改min
的唯一其他位置是:
min = (min == Integer.MAX_VALUE ? min : min + 1);
但是,因为min
仍然是整数。最大值
,它永远不会改变。我让你从这里拿走。
这是Leetcode的硬币兑换问题,在这里,给定面额的硬币是无限的,你必须找到满足给定金额所需的最小硬币。我尝试使用自顶向下的1D缓存阵列解决这个问题。基本测试用例通过了,但对于一些较大的总和和面额值,它失败了。我的假设是,我在遍历数组时做错了什么,可能遗漏了一些子问题的计算,但无法找到解决问题的方法。 问题陈述: 我的解决方案:
问题是: 下面是我的Java类,我认为它的代码可以解决问题9:
尝试[解决]leetcode(322)中的问题: 你会得到不同面额的硬币和总金额。写一个函数来计算你需要的最少数量的硬币来组成这个数量。如果这些硬币的任何组合都不能弥补这个金额,返回-1。 我被困在这个输入:硬币=[2]和目标=3 我想知道它为什么返回0?我调试了这个,但没能弄清楚。
尝试为一般硬币更换问题编程一个DP解决方案,该解决方案还可以跟踪使用的硬币。到目前为止,我一直在努力给我所需的最低硬币数量,但不知道如何获得使用了哪些硬币以及使用了多少次。我尝试设置另一个表(布尔值),如果硬币被使用,但这似乎不能正常工作。有什么想法吗?
我有一个练习: 您将获得不同面额的硬币和总金额。请编写一个函数来计算您需要的最少数量的硬币,以弥补该金额。如果硬币的任何组合都无法弥补该金额,请返回-1 例1: 我还谷歌了一个这样的解决方案: 我知道它是关于DP的,但是,我对它很困惑,比如,的含义是什么,为什么要添加,为什么要添加,为什么要添加1? 有人能用简单的英语指出出路吗?
给定一个值N,如果我们想换N美分,并且我们有无限量的S={S1,S2,…,Sm}值的硬币,我们可以用多少种方式来换?硬币的顺序无关紧要。 例如,对于N=4和S={1,2,3},有四种解:{1,1,1,1},{1,1,2},{2,2},{1,3}。所以输出应该是4。对于N=10和S={2,5,3,6},有五个解:{2,2,2,2},{2,2,3,3},{2,2,6},{2,3,5}和{5,5}。所以