为什么我会得到一个堆栈溢出错误,我试图在开始使用动态编程之前以递归方式解决这个问题。在方法硬币中,“a”是保存将形成硬币的硬币的数组我想要的总和,sum是我想要的总数(例如17),我代表他所在的数组的索引
import java.util.*;
public class dp2 {//RECURSIVE WAY THEN OPTIMIZE TO DP
public static int coins (int [] a, int sum,int i){
if (sum==0)
return 1;
else if (i==a.length){
return 0;
}
else if (i>a.length&&sum<a[i]){
return coins(a,sum,i++);
}
else {
return coins(a,sum-a[i],i++)+coins(a,sum-a[i],i);
}
}
public static void main (String [] args ){
Scanner sc = new Scanner (System.in);
while (sc.hasNext()){
int x = sc.nextInt();
int y=x;
int [] a ={1,5,10,25,50};
int w = coins(a,y,0);
System.out.println("There are " +w+ " ways to produce "+x + " coins change.");
}
}
}
答案 0 :(得分:0)
您遇到无限循环问题。
首先检查,你想要返回什么,因为实际上你只能返回1或0.那么,其他条件在哪里?示例:i == a.length - 1或sum&lt; 0?我想,你要归还总和。
接下来,如果您放置示例17,那么从阵列中选择巫金的机制在哪里可以选择?
接下来,请更改return coins(a,sum-a[i],++i)+coins(a,sum-a[i],i);
,因为在您的代码中我始终为0
所以,也许是你的优秀代码:
class dp2 {//RECURSIVE WAY THEN OPTIMIZE TO DP
public static int coins (int [] a, int sum,int i){
if (sum==0)
return 1;
else if (i==a.length){
return 0;
}else if(i + 1 == a.length || sum < 0 || sum - a[i] < 0){ //Your break condition ?
return sum;
}
else if (i>a.length&&sum<a[i]){
return coins(a,sum,i++);
}
else {
return coins(a,sum-a[i],++i)+coins(a,sum-a[i],i);
}
}
public static void main (String [] args ){
Scanner sc = new Scanner (System.in);
while (sc.hasNext()){
int x = sc.nextInt();
int y=x;
int [] a ={1,5,10,25,50};
int w = coins(a,y,0);
System.out.println("There are " +w+ " ways to produce "+x + " coins change.");
}
}
}
答案 1 :(得分:0)
我在你的代码中添加了一条语句,第4行:
System.out.println(sum + ", " + i);
输入27,输出为:
27, 0
26, 0
25, 0
.... decreasing by one each time...
3, 0
2, 0
1, 0
0, 0
-4, 1
-9, 1
-14, 1
然后它永远不会停止,因为你没有检查sum < 0
。
你应该能够从那里弄明白...... println
:世界上最轻的调试器: - )