计算硬币可能组合的方法总数

时间:2011-12-05 03:28:00

标签: java

  

可能重复:
  How to count possible combination for coin problem

在这种情况下,假设金额为15,硬币为1,6,7,那么它的总路数为6.下面的代码工作正常,但效率不高。任何建议将不胜感激。

public class CoinProblem {

    public static void main(String[] args) {
        int amount = 15;
        int coinTypes[] = {1,6,7};


        int combinations = 0;
        for (int i = 0; i * 7 <=15; i++) {
            for (int j = 0; j * 6 + i * 7 <= 15; j++) {
              combinations++;
            }
        }
        System.out.println(combinations);


    }
}

1 个答案:

答案 0 :(得分:0)

如果您正在寻找动态编程解决方案(如果您有更多的硬币和更大的总和可以工作),我有一个想法是:

int[] ways = new int[amount+1];
ways[0] = 1;    //There is only one way to have 0 money, no coins
for (int coin : coinTypes)
{
    for (int i = 1; i <= amount; i++)
    {
        ways[i] += ways[i-coin];
    }
}

标准免责声明,我没有运行此代码。它可能有错误,但看起来确实有效。它至少有两个:1。你需要将数组的方式初始化为0. 2.你需要防止数组下溢(使数组索引小于0)。

它的工作方式是你只用一种类型的硬币,然后两种类型的硬币,最后是三种硬币,存储你可以获得的总计数的方式。对于每个金额y,您知道可以通过查看所有可以获得y-x值的方法,然后添加值为x的硬币,使用值为x的硬币来实现该金额。