这是hackerrank(https://www.hackerrank.com/challenges/coin-change)的硬币找零问题。 它要求计算使用给定面额的硬币对N进行更改的总数。
例如,有四种方法可以使用面额1、2和3的硬币更改4。
它们是-{1,1,1,1}, {1,1,2}, {2,2}, {1,3}.
我尝试使用Java中的动态编程来实现递归解决方案。我的解决方案基于这样一个思想,即对于给定面额的每个硬币,我们反复查看是否可以通过选择硬币来达到总数。如果在解决方案中选择当前的硬币,我们将更新总数的方法。但是该解决方案不起作用。
这是实现
public static long getWays(long n, long[] c) {
Map<String, Long> map = new HashMap<String, Long>();
return fun(n, c, 0, map);
}
public static long fun(long n, long[] c, int i, Map<String, Long> memo){
if(n == 0) return 1;
if(i >= c.length) return 0;
if(n < c[i]) return 0;
String key = n + "_" + i;
if(memo.containsKey(key)) return memo.get(key);
long ways = fun(n, c, i+1, memo) + fun(n-c[i], c, i, memo);
memo.put(key, ways);
return ways;
}
这给了我错误的答案。例如,有5种方法使用{2, 5, 3, 6}
的硬币对10进行更改,但输出为4。
我在哪里错了?
答案 0 :(得分:0)
乍一看,如果比剩余价值高的硬币位于数组中第i个位置的位置,您的解决方案将跳过解决方案。考虑一下n = 5和c = [10,5]的情况。答案应该是1。
在您的代码中,它将进入if语句,检查是否n
if(n < c[i]) return 0;
并且将返回0。