Java代码中的硬币交换stackOverflowError

时间:2013-07-13 03:13:27

标签: java coin-change

无法找到问题,每当我运行此代码时,由于此行而导致stackoverflow

countCombine += count(array,money - (array[i]*(int)(money/array[i])));
基本上问题很容易。 给定值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,2,3,3}, {2,2,6},{2,3,5}和{5,5}。所以输出应该是5。

    public class CoinExchangeProblem {

        int countCombine = 0;
        private int count(int array[],int money){
    //        sort the array 
    //        Arrays.sort(array);    
    //        System.out.println(Arrays.toString(array));


            if (money == 0) {
                return 1;
            } else if (money < 0) {
                return 0;
            }


            for(int i = 0; i < array.length; i++){
                countCombine += count(array,money - (array[i]*(int)(money/array[i])));
            }
            return countCombine;

        }




        public static void main(String[] args) {
            CoinExchangeProblem coinExch = new CoinExchangeProblem();
            System.out.println(coinExch.count(new int[]{1,2,3}, 4));
    //        System.out.println(coinExch.count(new int[]{2, 5, 3, 6}, 10));
        }
}

1 个答案:

答案 0 :(得分:2)

当这部分

(array[i]*(int)(money/array[i]))

等于零你是无限递归的受害者,你用相同的金额调用函数

您可以将其更改为:

 if(money >= array[i])
        countCombine += count(array,money - (array[i]*(int)(money/array[i])));

所以你永远不会在这里获得零,但是测试它的更多例子,因为我没有经常测试它,但我认为它在逻辑上是正确的