【问题标题】:Sum of how many numbers should N be partitionedN 应该划分多少个数的总和
【发布时间】:2021-11-15 04:19:05
【问题描述】:

整数的分区:

4 = 4                 p(4,1) = 1
  = 1+3, 2+2          p(4,2) = 2
  = 1+1+2             p(4,3) = 1
  = 1+1+1+1           p(4,4) = 1
  

/max(p(4, k)) = 2,在 k = 2

5 = 5                 p(5,1) = 1
  = 1+4, 2+3          p(5,2) = 2
  = 1+1+3, 1+2+2      p(5,3) = 2
  = 1+1+1+2           p(5,4) = 1
  = 1+1+1+1+1         p(5,5) = 1
  

/max(p(5, k)) = 2,在 k = 2 和 3

p(n) = Σp(n, k) for ∀k: 0<k<=n

p(4) = p(4, 1) + p(4, 2) + p(4, 3) + p(4, 4) = 1 + 2 + 1 + 1 = 5

p(5) = p(5, 1) + p(5, 2) + p(5, 3) + p(5, 4) + p(5, 5) = 1 + 2 + 2 + 1 + 1 + 1 = 7

为此,我使用了欧拉的身份p(n, k) = p(n-1, k-1) + p(n-k, k)

#p(n, k) = p(n-1, k-1) + p(n-k, k)
N = int(input())
p = [[0]*(N+1) for i in range(N+1)]
for i in range(N+1):
    p[i][1] = 1
    p[i][i] = 1
for n in range(2, N+1):
    for k in range(2, n+1):
        p[n][k] = p[n-1][k-1] + p[n-k][k]
print(sum(p[-1])) 
for x in p:
    print(x[1:])
    print(sum(x))

使用上面的代码,我可以找到整数的分区:p(N),即给定数字n 可以表示为所有正整数之和的方式总数。

但是,现在我想找到k 的值,其中p(n, k) 最大。

但是没有在 python 中使用欧拉恒等式

【问题讨论】:

    标签: python-3.x algorithm math dynamic-programming number-theory


    【解决方案1】:

    执行以下操作:

    N = int(input())
    p = [[0]*(N+1) for i in range(N+1)]
    
    maximum = 0
    k_number = 0
    ans = []
    for i in range(N+1):
        p[i][1] = 1
        p[i][i] = 1
    for n in range(2, N+1):
        k_number, maximum = 0, 0
        for k in range(2, n+1):
            p[n][k] = p[n-1][k-1] + p[n-k][k]
            if p[n][k] > maximum :
                  maximum = p[n][k] 
                  k_number = k
                  n_for_max = n
        ans.append([n, k_number, maximum])
    print(sum(p[-1])) 
    for x in p:
        print(sum(x))
    for x in ans:
        print(x)
    #print('k_number: ',k_number)
    

    【讨论】:

    • 谢谢!但是,我想不使用欧拉恒等式。 (动态)并编辑您的代码以跟踪所有 ks ∀n 可以 print(ans[-1]) 。此外,kmax(p(n, k)) 可能有两个值,当两者相等且最大值相同时,例如p(8,3)=p(8,4) and also max for n = 8,您可以更改条件。
    【解决方案2】:

    对于相当小的n 值,您可以隐式生成所有分区,计算每个分区中的部分数量。

    n = 7
    kcounts = [0]*n
    
    def parts(sum, last = 1, k=0):
        if sum == 0:
            global kcounts
            kcounts[k-1] += 1
            return
    
        for i in range(last, sum + 1):
            parts(sum - i, i, k + 1)
    
    parts(n)
    print(kcounts)
    
    >>[1, 3, 4, 3, 2, 1, 1]
    

    所以 k=3 给出最大分区数

    【讨论】:

    • 哇!巧妙!如此聪明的解决方案+如此简单!你可以解释你的代码。
    • 注意它不适合大型n,因为分区数呈指数增长。对于优化,可以应用某种表格、动态规划,也许最好的是欧拉恒等式;)
    • P.S.我注意到您从未将问题的答案标记为解决方案。你知道这种可能性吗?
    • 是的,欧拉的恒等式适用于 n
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多