我的朋友给了我这个问题他在接受采访时被问到他无法回答。经过几个小时的思考,我们无法提出解决方案。
考虑三号。我需要编写一个程序来计算不同的方式,你可以将数字写成一个小于数字的数字之和。
例如:
如果数字为2,则可以写为sum(1,1)
如果数字为3,则可以写成sum(1,1,1),sum(1,2),sum(2,1)
如果数字是4,它可以写成sum(1,1,1,1),sum(1,3),sum(3,1),sum(1,2,1),sum( 2,1,1),总和(1,1,2),总和(2,2)。 7种不同的方式
如果数字是5,它可以写成sum(1,1,1,1,1),sum(1,1,1,2),sum(1,1,2,1),sum (1,2,1,1),总和(2,1,1,1)等。
如何编写程序以确定数字可以分解为较小数字总和的方式
如果使用http://www.programminglogic.com/integer-partition-algorithm/
中的算法将sum(1,2)和sum(2,1)视为等效,我能够找到解决问题的方法但问题是总和(1,2)和总和(2,1)不同。我根本看不到这样做的模式。
任何帮助将不胜感激。我只是想知道解决方案。
答案 0 :(得分:6)
将数字视为点线:
4 -> . . . .
在两个相邻的点之间,我们可以用一个墙来将数字分成更小的数字:
1+3 -> .|. . .
2+2 -> . .|. .
1+2+1 -> .|. .|.
对于n-1
间隙中的每一个,我们都可以选择是否设置墙,总共有2^(n-1)
种可能性。但是,没有墙只留给我们只有数字,这是不允许的,所以我们删除它作为最终总计2^(n-1)-1
解决方案的可能性。
答案 1 :(得分:2)
您需要一个分区解决方案才能找到所有可能的答案。看看以下方法:
Find all ways to sum given number (with repetitions allowed) from given set
fast method to list all possible combination of numbers which sum to a const number
和一个很好的数学解释:
答案 2 :(得分:1)
用于计算不同总和数量的程序(如此处所指定)可能如下所示:
def SumsCount(n):
if n <= 1:
return 0
sumsCount = 0
# the first number i can be 1, 2, ..., n-1
for i in range(1,n):
# the rest must sum up to n-i
# or the rest is just the number (n-i)
sumsCount += SumsCount(n-i) + 1
return sumsCount
答案 3 :(得分:0)
这是一个简单的递归方程来解决这个问题: -
F(N) = (F(N-1)+1) + (F(N-2)+1) + F(N-3)...........F(1)+1
F(2) = 1
F(1) = 0
F(N-1) = (F(N-2)+1) + F(N-3)...........F(1)+1
F(N) = F(N-1) + F(N-1) + 1
F(N) = 2*F(N-1) + 1
求解方程式:
F(N) = 2^(N-2) + 2^(N-2) - 1
= 2^(N-1) - 1