find使用1,5,10,25,50美分获得总计17cents(例如)的方法数

时间:2017-01-20 10:34:06

标签: java recursion dynamic dynamic-programming recurrence

为什么我会得到一个堆栈溢出错误,我试图在开始使用动态编程之前以递归方式解决这个问题。在方法硬币中,“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.");
    }               
  }

}

2 个答案:

答案 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:世界上最轻的调试器: - )