問題:將正整數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種。下面介紹一種通過遞迴方法得到乙...