进行更改所需的最大硬币数量

时间:2015-09-21 04:46:11

标签: java algorithm recursion dynamic-programming coin-change

我试图做这个问题,给定某些面额的硬币,我想找到最大数量的硬币进行更改。

实施例 说,我给了价值3和5的硬币,我想改变15,解决方案是{3,3,3,3,3}(感谢JoSSte指出) 同样地,比如说,给定值为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&lt; 0)的支票,其中通过将大小设置为一个非常大的数字,从选项中删除了未加总和的组合。

但是,如何修改以上内容以查找最大硬币数

2 个答案:

答案 0 :(得分:1)

对于您的解决方案,您必须检查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;
    }

希望这应该有效..

答案 1 :(得分:0)

这是c ++中的硬币更改dp代码。

class BasePage(object):

def __init__(self, driver):
    self.driver = driver
    self.driver.implicitly_wait(20)

class MappingsPage(BasePage):
table_id = WebDriverWait(self.driver, 20).until(EC.presence_of_element_located((*MainPageLocators.mappings_details_savedpage_table)))
rows = table_id.find_elements(By.TAG_NAME, "tr")
for row in rows:  
    # Get the columns
    col_name = row.find_elements(By.TAG_NAME, "td")[1]  
    col_variable = row.find_elements(By.TAG_NAME, "td")[2]  
etc...