无法找到问题,每当我运行此代码时,由于此行而导致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));
}
}
答案 0 :(得分:2)
当这部分
(array[i]*(int)(money/array[i]))
等于零你是无限递归的受害者,你用相同的金额调用函数
您可以将其更改为:
if(money >= array[i])
countCombine += count(array,money - (array[i]*(int)(money/array[i])));
所以你永远不会在这里获得零,但是测试它的更多例子,因为我没有经常测试它,但我认为它在逻辑上是正确的