整數劃分,是指把乙個正整數n表示成系列正整數之和:
例如正整數6有如下11種不同的劃分,所以p(6)=11
6我把上述每種數字定義為6的劃分因子,可知,6有6種劃分因子,每種都有可能組成6。於是可以用乙個for迴圈來依次遍歷劃分因子。比如從1開始,1是第一位組成6的數,那麼還剩rest = 6-1.再對rest進行同樣分析,也就是遞迴。遞迴終止條件為當rest = 0時,6被分完了,就輸出。此時需要乙個資料結構來儲存合適的劃分因子,從這裡遍歷輸出。最後,為了去重,在遞迴後回溯時,加個if判斷,規定滿足:在資料結構裡儲存的劃分因子,當要儲存新的劃分因子之前,判斷該劃分因子比上一位(下標-1)不小於時才能允許存入。5+14+2,4+1+1
3+3,3+2+1,3+1+1+1
2+2+2,2+2+1+1,2+1+1+1+1
1+1+1+1+1+1
# 用python字典這個資料結構儲存劃分因子,從1開始,用0佔位
dividing_number =
# 次數累加變數
times =
0def
int_divide
(number, index)
:global times
# 從1開始遍歷該整數所有劃分因子
for i in
range(1
, number+1)
:# 與前一位劃分因子比較,去重,如先有24,42則不行
if i >= dividing_number[index-1]
: dividing_number[index]
= i # 當前數-劃分因子後還剩數,如6-1剩5
number_rest = number - i
# 整數被劃分完畢
if number_rest ==0:
# 輸出劃分因子
for j in
range(1
, index)
:print
(str
(dividing_number[j])+
'+', end='')
print
(str
(dividing_number[index]))
times = times +
1# 未被劃分完畢,繼續,dividing_number劃分位數+1
else
: int_divide(number_rest, index+1)
else
:pass
n =int
(input
("請輸入乙個整數\n"))
int_divide(n,1)
print
("所以該整數的劃分數為:%d"
% times)
為什麼選擇字典呢,因為字典是雜湊表類的乙個實現,搜尋效率較高
請輸入乙個整數
6
1+1+1+1+1+1
1+1+1+1+2
1+1+1+3
1+1+2+2
1+1+4
1+2+3
1+52+2+2
2+43+3
6所以該整數的劃分數為:11
學生初習演算法,若本文有不對之處, 或有大牛有更優解,或對學生有好的建議,敬請賜教,感激不盡 整數劃分問題java實現
public class integerdivision 將n劃分為最大整數不超過m的組合 param n要劃分的整數 param m return可能的組合個數 public static int q int n,int m 不超過0的組合個數為0或者0不能被劃分 if n 0 m 0 不超過m ...
python整數劃分,遞迴演算法
正整數n,n m1 m2 mk,其中mi為正整數,並且1 mi n,集合是整數n的乙個劃分。輸入乙個不小於10的整數,輸出其所有整數劃分。將整數n劃分,假設某種劃分中m為最大的整數,則 n可分為n m,m,n m 再由 m 1 劃分 n m 可分為 n m m 1 m 1 n m m 1 再由 m ...
整數劃分(劃分dp)總結
寫了幾個題發現整數劃分是一類題,而不是一道題。具體題型 1 n相同元素放入m個相同的盤子 盤子允許為空 例題 放蘋果 poj 1664設dp i j 為 j 個元素放入i個盤子轉移方程 dp i j dp i 1 j 新新增乙個盤子,盤子為空 dp i j dp i j i i個盤子 各取出乙個 2...