筆試演算法 正整數劃分

2021-10-05 21:37:09 字數 2606 閱讀 3305

將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數

輸入標準的輸入包含若干組測試資料。每組測試資料是乙個整數n(0 < n <= 50)。

輸出對於每組測試資料,輸出n的劃分數。

樣例輸入

樣例輸出

5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1

令q(n, m)為正整數n被分成m個數的劃分數,比如q(5, 3) = 2 即是【3+1+1, 2+2+1】,則這個題求的就是∑i=

1mq(

n,m)

\sum_^q(n , m)

i=1∑m​

q(n,

m)則令 s(n

,m)=

∑i=1

mq(n

,m

)s(n , m) = \sum_^q(n , m)

s(n,m)

=i=1

∑m​q

(n,m

)則有首先當n=0:return 1:表示已經被分完

m=0:則無法實現,即return 0

當m=1 or n=1:則return 1

n=1:則由1組成

m=1:則由n個1組成這兩種情況都是一種方式

當n < m 則:s(n,m)=s(n,n) :沒那麼多正整數分 所以轉換為s(n, n)

當n=m :s(n,m)= 1 + s(n, m-1):正整數n的劃分由直接全分為1這一種情況和

分為m-1種的劃分組成

即:i fm

=ns(

n,m)

=q(n

,m)+

s(n,

m−1)

=1+s

(n,m

−1

)if\quad m = n\newline s(n , m) = q(n , m) + s(n, m -1)=1+ s(n, m -1)

ifm=ns

(n,m

)=q(

n,m)

+s(n

,m−1

)=1+

s(n,

m−1)

n>m>1: s(n,m)=s(n,m-1)+s(n-m,m)

重要:s(n

,m)=

q(n,

m)+s

(n,m

−1)=

s(n,

m−1)

+s(n

−m,m

)s(n , m) = q(n , m) + s(n, m -1)\newline =s(n, m -1) +s(n-m, m)

s(n,m)

=q(n

,m)+

s(n,

m−1)

=s(n

,m−1

)+s(

n−m,

m)n要被分成m個, 此時,確定有m個1在等待分配, 餘下的值為 n - m,那麼將n-m分配給m個數有多少種分法,即是這題所求的 s(n-m, m)。故上等式成立

遞迴法(直觀但複雜)

def

dfs(n,m)

:if n==0:

return

1elif m==0:

return

0elif n==

1or m==1:

return

1elif nreturn dfs(n,n)

elif n==m:

return dfs(n,m-1)

+1else

:return dfs(n,m-1)

+dfs(n-m,m)

動態規劃法
def

s(n, m)

: dp =[[

0for i in

range

(n +1)

]for j in

range

(n +1)

] dp[0]

[0]=

1# 當n=0:return 1

for i in

range(1

, n +1)

:for j in

range(1

, n +1)

:# 此時 i 就是 n, j 就是 m,從s(1 ,1)開始算累加到所需要的值

if i < j:

dp[i]

[j]= dp[i]

[i]# 當n < m :s(n,m)=s(n,n)

if i == j:

dp[i]

[j]=

1+ dp[i]

[j -1]

# 當 n = m :s(n,m)= 1 + s(n, m-1)

if i > j:

dp[i]

[j]= dp[i]

[j -1]

+ dp[i - j]

[j]# n>m>1: s(n,m)=s(n,m-1)+s(n-m,m)

if i == n and j == m:

return dp[i]

[j]

計算正整數的劃分數

q 將一正整數表示成各種正整數之和的形式,可以寫成的所有劃分方式的總共數量叫做劃分數,程式設計實現輸出任意乙個正整數的劃分數。採用遞迴方法,而關鍵在於寫出遞迴函式。對於該題,如下 div int intnum,int max addnum 1,max addnum 1 div int num,num...

正整數分解演算法

問題 將以正整數n表示成一系列正整數之和.n n1 n2 n3 nk n1 n2 n3 nk 1,k 1 這就是正整數n的乙個劃分,正整數n不同的劃分個數稱為正整數n的劃分數,記作p n 例如 6 有如下11種劃分則p 6 116 5 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2 ...

2014 華為筆試演算法彙總

1.通過鍵盤輸入一串小寫字母 a z 組成的字串。請編寫乙個字串過濾程式,若字串中出現多個相同的字元,將非首次出現的字元過濾掉。比如字串 abacacde 過濾結果為 abcde 要求實現函式 void stringfilter const char pinputstr,long linputlen...