將正整數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
∑mq
(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...