计算最小硬币数量时的Stackoverflow错误使得总和S.

时间:2013-07-01 08:56:33

标签: java recursion dynamic-programming stack-overflow

这里我正在研究以下问题,其中我们给出了n种值的硬币面值v(1) > v(2) > ... > v(n) (all integers)以下代码试图找出制作总和所需的最小硬币数量 - C。这里的C是100(参见main函数)。当我运行代码时,出现错误 - “java.lang.StackOverflowError”。请帮忙。

import java.util.ArrayList;

public class Problem2 {

    public static int count=4;
    public static int []v={25,10,5,1}; //Array storing denominations

    private static int findminimum(ArrayList<Integer> v2) {

        int count=v2.get(0);
        for(int i=0;i<v2.size();i++)
        {
            if(count>v2.get(i))
            {
                count=v2.get(i);
            }
        }
        return count;
    }

    public static int countmincoins(int n)
    {
        int t;
        if(n<0)
        {
            t=Integer.MAX_VALUE-100 ;
        }
        if(n==0)
        {
            t= 0;
        }
        else
        {
            ArrayList<Integer> a=new ArrayList<Integer>();          
            for(int i=0;i<v.length;i++)
            {
                int temp=0;
                temp=countmincoins(n-v[i])+1; //Stackoverflow error
                a.add(temp);    
            }   
            t=findminimum(a);

        } 
        return t;   
    }


    public static void main(String args[])
    {

        System.out.println(countmincoins(100)); 
    }
}

3 个答案:

答案 0 :(得分:0)

如果您不限制使用递归,则以下内容会更简单:

public static int[] denominations = {25,10,5,1};

public static int minimumCoins(int amount){
    int total = 0;
    for(int denomination: denominations){
        while(amount - denomination >= 0){
            amount -= denomination;
            total++;
        }
    }
    return total;
}

public static void main(String args[])
{

    System.out.println(minimumCoins(98)); 
}

答案 1 :(得分:0)

如果使用递归,则需要达到终止递归的条件。但是在你的代码中我没有看到任何终止逻辑。这就是为什么,它得到无限循环和StackOverflowException。在您的代码中,您使用以下代码来终止。

if(n==0)
{
    t= 0;
}

但这里n可能不是零。因为countmincoins(n-v[i])不能确保你将为0。

答案 2 :(得分:0)

您的代码是无限的,t永远不会是<0 or ==0,因为数组中的值和条件(n - v[i] )+1v[i]将始终返回相同的值调用方法,因此无限递归。