java - 找零所需的最大硬币数量

标签 java algorithm recursion dynamic-programming coin-change

我正在尝试做这个问题,给定一定面额的硬币,我想找到最大数量的硬币来找零。

例子 比如说,我得到了值(value) 3 和 5 的硬币,我想找零 15,解决方案是 {3,3,3,3,3}(感谢 JoSSte 指出) 同样,假设给定值(value) 3 和 5 的硬币,我想找零 7,我需要显示“没有可能的解决方案”

我能够按照以下方式找到最小数量的硬币

import java.util.ArrayList;
import java.util.Arrays;


public class Minimum
{
    static int[] options = {5,3};

    public static void main(String[] args)
    {
        ArrayList<Integer> result = new ArrayList<Integer>();

        result = fun(15);
        if(result.size() == 999)
             System.out.println("Not possible to make change with this denomination");
        else 
        {
            for(int i = 0;i<result.size();i++)
                System.out.print(result.get(i));
        }
    }

    static ArrayList<Integer> fun(int n)
    {       
        if(n == 0)
        {
            ArrayList<Integer> totalret = new ArrayList<Integer>();
            return totalret;
        }

        if(n < 0)   
        {
            ArrayList<Integer> totalret  = new ArrayList<Integer>(Arrays.asList(new Integer[999]));
            return totalret;
        }

        ArrayList<Integer> totalret  = new ArrayList<Integer>(Arrays.asList(new Integer[999]));
        for(int i = 0;i<options.length;i++)
        {
            ArrayList<Integer> reci = fun(n-options[i]);

            ArrayList<Integer> reti = new ArrayList<Integer>();
            reti.addAll(reci);
            reti.add(options[i]);

            if(reti.size() < totalret.size())
                totalret = reti;
        }
        return totalret;
    }
}

请注意,我有一个名为 if(n<0) 的检查,通过将它们的大小设置为一个非常大的数字(不能是最小值),将不加起来等于总和的组合从选项中删除。

但是,我如何修改上面的代码才能找到最大硬币数

最佳答案

对于您的解决方案,您必须检查 n=1,2 的条件。如果 n=1,2 你可以返回 ans 作为 999。

你的函数必须如下所示

 static ArrayList<Integer> fun(int n)
   {       
     if(n == 0)
     {
            ArrayList<Integer> totalret = new ArrayList<Integer>();
            return totalret;
        }

        if(n < 0 || n==1 || n==2)   
        {
            ArrayList<Integer> totalret  = new ArrayList<Integer>(Arrays.asList(new Integer[999]));
            return totalret;
        }

        ArrayList<Integer> totalret  = new ArrayList<Integer>(Arrays.asList(new Integer[999]));
        for(int i = 0;i<options.length;i++)
        {
            ArrayList<Integer> reci = fun(n-options[i]);

            ArrayList<Integer> reti = new ArrayList<Integer>();
            reti.addAll(reci);
            reti.add(options[i]);

            if(reti.size() < totalret.size())
                totalret = reti;
        }
        return totalret;
    }

希望这能奏效..

关于java - 找零所需的最大硬币数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32687529/

相关文章:

java - 创建套接字时出现 SocketTimeOutException,java

java - Redis 与原生 Java 性能对比

java - 递归中的局部变量保留值?

c - 递归幂函数 : approach

c++ - 递归和函数 c++

Javamail 535 5.7.8 身份验证失败

java - 如何遍历 hashmap 值中的 List

java - 使用 Thymeleaf 3.x 处理表单验证 - 样式化错误

java - 在 Java 中使用递归的主要因素

c - GUI系统实现