如何确定数字可以分解为较小数字的总和的方式

时间:2013-12-01 10:40:57

标签: python c algorithm

我的朋友给了我这个问题他在接受采访时被问到他无法回答。经过几个小时的思考,我们无法提出解决方案。

考虑三号。我需要编写一个程序来计算不同的方式,你可以将数字写成一个小于数字的数字之和。

例如:

如果数字为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)不同。我根本看不到这样做的模式。

任何帮助将不胜感激。我只是想知道解决方案。

4 个答案:

答案 0 :(得分:6)

将数字视为点线:

4     -> . . . .

在两个相邻的点之间,我们可以用一个墙来将数字分成更小的数字:

1+3   -> .|. . .
2+2   -> . .|. .
1+2+1 -> .|. .|.

对于n-1间隙中的每一个,我们都可以选择是否设置墙,总共有2^(n-1)种可能性。但是,没有墙只留给我们只有数字,这是不允许的,所以我们删除它作为最终总计2^(n-1)-1解决方案的可能性。

答案 1 :(得分:2)

答案 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