(1)正整數n劃分為若干正整數之和,最大加數不超過m的劃分數(n劃分最大加數不超過m)
(2)正整數n劃分為不超過m個正整數之和的劃分數(n劃分為m份)
(3)正整數n劃分為若干正奇整數之和的劃分數
(4)正整數n劃分為互不相同正整數之和的劃分數
其中,整數劃分無順序,比如對7劃分,認為2 2 3和3 2 2和2 3 2為同一種劃分。
(1)問題1和問題2等價。
根據n和m的關係,考慮以下幾種情況:
當n=1時,不論m的值為多少(m>0),只有一種劃分即;
當m=1時,不論n的值為多少,只有一種劃分即n個1,;
當n=m時,根據劃分中是否包含n,可以分為兩種情況:
a.劃分中包含n的情況,只有乙個即;
b.劃分中不包含n的情況,這時劃分中最大的數字也一定比n小,即n的所有(n-1)劃分。因此f(n,m) =1 + f(n,n-1);
當n但n>m時,根據劃分中是否包含最大值m,可以分為兩種情況:
a. 劃分中包含m的情況,即}, 其中 的和為n-m,可能再次出現m,因此是(n-m)的m劃分,因此這種劃分個數為f(n-m, m);
b.劃分中不包含m的情況,則劃分中所有值都比m小,即n的(m-1)劃分,個數為f(n,m-1)。因此f(n, m) = f(n-m, m)+f(n,m-1);
遞推表示式如下:f(n
,m)=
1&&&&&&&(1)和(2)\\ f(n, n)&&&&&&&(5)\\ \end
f(n,m)
=⎩⎪⎪
⎪⎨⎪⎪
⎪⎧1
f(n,
n)1+
f(n,
n−1)
f(n−
m,m)
+f(n
,m−1
)n=
1∣∣m=1n
=mn>m
(1)
和(2)
(3)(
4)(5
)(2)問題3。
對情況4和情況5進行修改:增加對奇偶數不同情況的分析
遞推表示式如下:f(n
,m)=
1&&&&&&&(1)和(2)\\ f(n, n)&&&&&&&(5.1)\\ f(n,m-1)&&&&&&&(5.2)\\ \end
f(n,m)
=⎩⎪⎪
⎪⎪⎪⎪
⎪⎪⎨⎪
⎪⎪⎪⎪
⎪⎪⎪⎧
1f(
n,n)
1+f(
n,n−
1)f(
n,n−
1)f(
n−m,
m)+f
(n,m
−2)f
(n,m
−1)
n=1∣
∣m=1
n=m,m
%2=1
n=m,
m%2=
0n>m,
m%2=
1n>m,
m%2=
0
(
1)和(
2)(3
)(4.
1)(4
.2)(
5.1)
(5.2
)(3)問題4
對情況2進行修改:當m=1時,不論n的值為多少,只有一種劃分即n個1,,但出現了重複,故劃分失敗。
對情況5的a進行修改:劃分中包含m的情況,即}, 其中 的和為n-m,不可能再次出現m,因此是(n-m)的m-1劃分,因此這種劃分個數為f(n-m, m-1);
遞推表示式如下:
f (n
,m)=
1&&&&&&&(1)\\ 0&&&&&&&(2)\\ f(n, n)&&&&&&&(5)\\ \end
f(n,m)
=⎩⎪⎪
⎪⎪⎪⎪
⎨⎪⎪⎪
⎪⎪⎪⎧
10f
(n,n
)1+f
(n,n
−1)f
(n−m
,m−1
)+f(
n,m−
1)n
=1m=
1&&n
>1n
=mn>m
(1)
(2)(
3)(4
)(5)
其中,(1)和(2)是回歸條件(即邊界),(3)和(4)是特殊情況,將會轉換為情況(5),(5)通過減小m以達到回歸條件。
#include
using namespace std;
//正整數n劃分為若干正整數之和,最大加數不超過m的劃分數
intintergerdiv
(int n,
int m)
//正整數n劃分為若干正整數之和,最大加數不超過m的劃分數,且m不重複
intnotrepeteinterdiv
(int n,
int m)
//正整數n劃分為若干正整數之和,最大加數不超過m的劃分數,m只能取奇數
intonlysingleinterdiv
(int n,
int m)
else
}else
else}}
intmain()
演算法設計與分析 整數劃分問題
將正整數n表示成一系列正整數之和 n n1 n2 nk,其中n1 n2 nk 1,k 1。正整數n的這種表示稱為正整數n的劃分。求正整數n的不同劃分個數。舉例 例如正整數6有如下11種不同的劃分 6 5 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2 2 2,2 2 1 1,2 1 ...
整數劃分問題 演算法
在遞迴裡,要對形參進行判斷 1 當n 1時 q 1,m 表示是對1的劃分,那麼只有一種劃分方式 1 2 當m 1時q n,1 當m 1時其實就是把讓所有加數小於等於1,那就是所有加數都是1咯 不考慮負數 當然也只有一種劃分方式 3 當n m時q n,n 此時就是對n的劃分出來的數沒有限制,預設限制就...
全排列與整數劃分演算法分析
1.全排列演算法 題目 求出1 n的全排列.思想 交換第1個元素與第i個元素,得到n個序列 把每個序列分成兩部分 第乙個元素,其餘的元素 對其餘元素執行全排列操作,記得操作完後,將這兩個元素交換回來,以方便下面的交換.演算法實現 void swap int a,int b 交換a和b void pe...