问题76:将一百写成至少两个正整数之和的不同方式有多少种?
我不知道如何开始... 可以给点方向或帮助吗?我不需要详细的解答,只需要提示。
例如 5 可以被写为:
4 + 1
3 + 2
3 + 1 + 1
2 + 2 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1
所以总共有6种可能性。
问题76:将一百写成至少两个正整数之和的不同方式有多少种?
我不知道如何开始... 可以给点方向或帮助吗?我不需要详细的解答,只需要提示。
例如 5 可以被写为:
4 + 1
3 + 2
3 + 1 + 1
2 + 2 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1
所以总共有6种可能性。
使用切分算法可以找到解决方案。
例如,使用6进行切分。然后我们有:
6
5+1
4+2
3+3
但我们还没有完成。
如果我们将5+1视为一个整体,并考虑+1部分已经完成,因为所有其他的结束组合都由4+2和3+3处理。所以我们需要将同样的技巧应用到5上。
4+1+1
3+2+1
我们可以继续进行下去,但不能盲目地进行。例如,4+2会产生3+1+2和2+2+2。但我们不需要3+1+2,因为我们将有一个3+2+1。因此,我们只使用所有4的乘积,其中最低数大于或等于2。
6
5+1
4+1+1
3+1+1+1
2+1+1+1+1
1+1+1+1+1+1
2+2+1+1
3+2+1
4+2
2+2+2
3+3
func CountCombinations(Number, Minimal)
temp = 1
if Number<=1 then return 1
for i = 1 to Floor(Number/2)
if i>=Minimal then
temp := temp + CountCombinations(Number-i, i)
end for
return temp
end func
检查算法:
C(6,1) = 1 + C(5,1) + C(4,2) + C(3,3) = 11, which is correct.
C(5,1) = 1 + C(4,1) + C(3,2) = 7
C(4,1) = 1 + C(3,1) + C(2,2) = 5
C(3,1) = 1 + C(2,1) = 3
C(2,1) = 1 + C(1,1) = 2
C(1,1) = 1
C(2,2) = 1
C(3,2) = 1
C(4,2) = 1 + C(2,2) = 2
C(3,3) = 1
顺便说一下,100的组合数:
CC(100) = 190569292
CC(100) = 190569291 (if we don't take into account 100 + 0)
处理这些问题的好方法不是纠结于“100”,而是尝试考虑求和总数为 n 和 n+1 之间的差异,通过寻找随着 n 增加而出现的模式来实现。
我现在可以试一下,但我有工作要做 :)
注意:我的数学有点生疏,但希望这可以帮到你...
你在很好地分解问题。
思考一般情况:
所以,想法是找到第一个集合(假设 5 = (5-1)+1),然后将 (5-1) 视为新的 n...5 = 4 +1...5 = ((4-1)+1)+1。一旦这个集合用完了,就从 5 = 3 + 2 开始...变成 5 = ((3-1)+1)+2....= 2+1+2....在沿途分解每个数字。
许多数学问题可以通过归纳法来解决。您知道特定值的答案,如果您找到将n
与n+1
联系起来的某些内容,您就可以找到每个值的答案。
例如,在您的情况下,您知道一个正整数至少可以用两个正整数相加的方式表示的不同方法有多少种?的答案只是1。
我所说的n
和n+1
之间的联系是什么意思呢?我的意思是您必须找到一个公式,只要您知道n
的答案,您就可以找到n+1
的答案。然后,递归调用该公式,您将知道答案并完成了(注意:这只是数学部分,在现实生活中,您可能会发现这种方法太慢而无法实际使用,因此您还没有完成 - 在这种情况下,我认为您将完成)。
现在,假设你知道n
可以被写成至少两个正整数的和,有k
种不同的方式,其中一种是:
n=a1+a2+a3+...am(这个和有m项)
关于n+1
,你能说什么呢?由于我只想给你一些提示,所以我不会在这里写出解决方案,只会写下接下来的内容。当然,你肯定有相同的k
种不同的方式,但在每种方式中都会有一个+1
项,其中一种是:
n+1=a1+a2+a3+...am+1(这个和有m+1项)
那么,你当然还有其他k
种可能性,例如每个和的最后一项不相同,但会增加一项,如:
n+1=a1+a2+a3+...(am+1)(这个和有m项)
因此,至少有2k种将n+1
写成至少两个正整数之和的方式。好吧,还有其他的方式。如果你能找到它们,就去试试吧 :-)