最小硬币自上而下的解决方案没有给出预期的结果
minimum coin top-down solution is not giving expected results
我们有一个实习生使用自上而下的方法解决了最小硬币问题。
问题陈述给定一组硬币,return 形成总和所需的最少硬币。另外 return 构成总和的硬币。
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;
}
}
}
代码大部分看起来不错。但没有 return 预期的结果。
当使用上述输入执行时,程序 returns INT.MAX 作为 minCoins 并且列表为空。
关于代码哪里出错的任何提示?
谢谢
嗯,你把min
初始化为Integer.MAX_VALUE
,然后就有了下面的代码:
if (rs.min > min) {
min = rs.min;
coinsSoFar.addAll(rs.coins);
}
如您所见,rs.min
是一个 int
,永远不会大于 min
(即 Integer.MAX_VALUE
)。
您更改 min
的唯一其他地方如下:
min = (min == Integer.MAX_VALUE ? min : min + 1);
但是,因为min
仍然是Integer.MAX_VALUE
,所以永远不会改变。我让你从这里拿走。
我们有一个实习生使用自上而下的方法解决了最小硬币问题。 问题陈述给定一组硬币,return 形成总和所需的最少硬币。另外 return 构成总和的硬币。
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;
}
}
}
代码大部分看起来不错。但没有 return 预期的结果。 当使用上述输入执行时,程序 returns INT.MAX 作为 minCoins 并且列表为空。
关于代码哪里出错的任何提示? 谢谢
嗯,你把min
初始化为Integer.MAX_VALUE
,然后就有了下面的代码:
if (rs.min > min) {
min = rs.min;
coinsSoFar.addAll(rs.coins);
}
如您所见,rs.min
是一个 int
,永远不会大于 min
(即 Integer.MAX_VALUE
)。
您更改 min
的唯一其他地方如下:
min = (min == Integer.MAX_VALUE ? min : min + 1);
但是,因为min
仍然是Integer.MAX_VALUE
,所以永远不会改变。我让你从这里拿走。