演算法設計與分析 整數劃分問題

2021-08-28 22:13:43 字數 2837 閱讀 5752

(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...