【发布时间】:2017-07-10 18:49:54
【问题描述】:
问题陈述:
给你两个数,分别是 A 和 S。编写一个程序,找出大于或等于 S 的数相加得到总和 A 的方式数。将结果打印为模 10 ^9+9。
例如如果 A 为 3 且 S 为 1,则有三种方法可以使用大于等于 S=1 的数字来实现 A=3。解决方案是 、 和 。 对于 A=9 和 S=3,解决方案将是 、、 和 。使用大于等于 3 的数字,共有 4 种方法得到 9。
我使用了以下方法。
- 检查 (S>A/2) 是否只有一种解决方案。例如,如果 A=9 并且 S=5 那么只有一种解决方案是可能的,即 。
- 如果条件 1 不成立,则创建一个列表并存储所有符合条件的 i S
-
对于列表中的每个数字 i。
3.1。而 A>=i
3.1.1。将 A 减 i。
3.1.2。如果 A>=i 则递增 count(count 存储总排列并且是 初始设置为 1)。
3.1.3。 else 退出 while 循环。
这种方法具有二次时间复杂度。有没有更好的方法来解决这个问题?
【问题讨论】:
-
假设 A >= S。你可以拥有的最大整数个数是 k = floor(A/S) >= 1,最小值是 1。让我们考虑一组 r 个整数, 1 en.wikipedia.org/wiki/Partition_%28number_theory%29
-
@DaveGalvin 感谢维基百科链接。对于 A=9 和 S=3,解决方案将是 、、 和 。但是使用您指定的方法我的 k=floor(9/3)=3。整数 r 的范围从 1 到 3。这样我只能得到解 、。我将如何获得第 4 个解决方案 ?
-
@jaikishan_gurav 不,对于 r=2,您从 开始,剩下 3 个,然后计算将这三个球分配到两个箱子的不同方式的数量。这给了你 3,0 和 2,1。然后将这些添加到 给你 和 。困难的部分是计算将相同的球分配到相同的箱子的方法的数量。
标签: algorithm