在这种情况下,假设金额为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);
}
}
答案 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的硬币来实现该金额。