|
|
1
13
可以使用生成函数方法给出使用复数的快速算法。 给定硬币的值c1,c2,…,ck,得到求n和的方法数,你需要的是x^n的系数
这与在
现在使用复数,x^a-1=(x-w1)(x-w2)…(x-wa),其中w1,w2等是单位的复数根。 所以
可以写成
可以用部分分数重写的是
这里的x^n系数很容易找到:
计算机程序应该很容易找到人工智能和人工智能(可能是复数)。当然,这可能涉及浮点计算。 对于大n,这可能比枚举所有可能的组合快。 希望能有所帮助。 |
|
|
2
35
使用递归。
不过,您应该检查这个实现。我这里没有JavaIDE,而且我有点生疏,所以它可能有一些错误。 |
|
|
3
11
尽管递归可以工作,而且在一些大学级的算法和数据结构课程中经常是一项要实现的任务,但我相信“动态编程”的实现更有效。
|
|
|
4
6
递归非常简单:
这是SCALA中的示例 |
|
|
5
3
Aryabhattaâs answer 对于 计算使用固定硬币进行改变的方法的数量 面额非常可爱,但也不切实际 描述。我们将使用模块化而不是复数 算术,类似于数论变换如何代替 整数多项式乘法的傅里叶变换。
让
应试者
请注意
让
哪里
给定这个设置,我们可以计算
|
|
|
6
2
|
|
|
7
1
递归解决方案可能是正确的答案:
警告:我还没有测试,甚至没有编译以上内容。 |
|
|
8
1
上面提到的递归解决方案会起作用,但是如果你增加更多的硬币面额和/或显著增加目标值,它们的速度会非常慢。 您需要加速的是实现一个动态编程解决方案。看看 knapsack problem . 您可以调整这里提到的DP解决方案来解决您的问题,方法是记下达到总数的方法数,而不是所需的最小硬币数。 |
|
|
9
1
@Jordi提供的解决方案很好,但运行速度非常慢。您可以尝试输入600到该解决方案,看看它有多慢。 我的想法是使用自下而上的动态编程。 注意,一般来说,货币的可能组合=m和硬币{a,b,c}等于
如果没有可用的硬币或可用的硬币无法支付所需的金额,则应相应地填写0到块。如果金额为0,则应填写1。
|
|
|
10
1
这段代码基于JeremyP提供的解决方案,它工作得很好,我只是使用动态编程来优化性能
|
|
|
11
0
第一个想法:
(在这种情况下,“<=”是多余的,但如果您决定更改参数,则需要更一般的解决方案) |
|
|
12
0
再次使用递归是一个经过测试的解决方案,虽然可能不是最优雅的代码。(注意,它返回要使用的每个硬币的编号,而不是重复实际的硬币弹药n次)。
} |
|
13
0
下面是使用memoization java解决方案的递归。下面我们有1,2,3,5作为硬币,200作为目标数量。
|
|
|
14
-1
|
|
|
15
-8
硬币(1,5,10,25,50)的相同问题有以下解决方案之一。 解应满足下列方程: 1*a+5*b+10*c+25*d+50*e==美分 公共静态void countWaysToProduceGivenAmountOfMoney(整数分){
对于任何一般解决方案,都可以对其进行修改。 |
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |