解决硬币找零问题有什么问题?

时间:2019-07-30 10:06:10

标签: java dynamic-programming

这是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。

我在哪里错了?

1 个答案:

答案 0 :(得分:0)

乍一看,如果比剩余价值高的硬币位于数组中第i个位置的位置,您的解决方案将跳过解决方案。考虑一下n = 5和c = [10,5]的情况。答案应该是1。

在您的代码中,它将进入if语句,检查是否n

if(n < c[i]) return 0;

并且将返回0。