整數劃分問題

2021-07-07 03:57:38 字數 1000 閱讀 5293

問題:將正整數n表示成一系列正整數之和。例如:

4 = 4;

4 = 3 + 1;

4 = 2 + 2; 4 = 2 + 1 + 1;

4 = 1 + 1 + 1 + 1;

正整數n的不同劃分個數稱為正整數n的劃分數,記做p ( n )  例如:  p ( 4 ) = 5

方法一:

分析: 在正整數n的所有不同的劃分中,將最大加數 n 1 不大於 m 的劃分個數記做 q (n,m)  可以建立q ( n,m)的如下的遞迴關係

q ( n , m ) =  1  當n =1 或者 m = 1時  

q ( n , m ) =  q(n,n) 當 n

q ( n , m ) = 1 + q (n,n-1) 當n=m時

q ( n , m ) = q ( n , m-1 ) + q(n-m,m) 當n>m>1時

這樣分析完我們就容易程式設計實現了:

#includeint q(int n,int m)

{ if(n<1||m<1)

return 0;

if(n==1||m==1)

return 1;

if(n

方法二:

分析:對於每種分解,我們可以看到分解的等式的第乙個數m為1到n (n為我們輸入的正整數n)

每當第乙個數確定後,我們再考慮下乙個數,這個數為1到n-m,依次求出我們很容易想到dfs

使用深度優先搜尋演算法

#includeint n;

int target[30];//用於記錄分解的等式

int count = 0;//用於記錄劃分的數量

void dfs(int sum,int index,int st)

{ int i;

if(sum == 0)//輸出一次的分解情況

{ count++;

printf("%d=%d",n,target[0]);

for(i=1;i

整數劃分問題

整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為 1 我們該如何找出所有的劃分呢?我們可以先來看看整數劃分的規律 譬如正整數 6 劃分情況如下 6 5 14 2 4 1 1 3 3 3 2...

整數劃分問題

給定乙個自然數,分成k部分,a1,a2.的數的和,要求a1 a2.求有多少種?原理 整數n拆分成最多不超過m個數的和的拆分數,和n 拆分成最大不超過m的拆分數相等。根據這個原理,原問題就轉化成了求最大拆分為k的拆分個數與最大拆分為k 1的拆分個數的差 f n,k f n,k 1 f n k,k 如下...

整數劃分問題

首先是遞迴解法 整數劃分問題是將乙個正整數n拆成一組數連加並等於n的形式,且這組數中的最大加數不大於n。如6的整數劃分為 65 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 1 1 1 1 1 1 1 1 共11種。下面介紹一種通過遞迴方法得到乙...