整數劃分是將正整數n表示為多個不小於1的整數之和的組合形式,不同順序的加數被視為同一划分,例如5=3+1+1與5=1+3+1屬於同一划分。其在計算機科學中常用於遞歸算法的典型問題。
該算法的核心是遞推關係:當n=1或劃分最大數為1時,劃分數為1;當n等於劃分最大數m時,劃分數為1加上n的(m-1)劃分;若n則等價於n的n劃分;其他情況遞歸計算包含與不包含最大值m的劃分數之和。通過約束劃分元素有序性避免重複計算,保證結果唯一性。
該算法思想源於組合數學中的整數分拆遞歸建模,遞推關係體現了動態規劃的重疊子問題特性。在編程實現中,常用遞歸或記憶化搜尋最佳化效率,C語言、Java等均可實現核心邏輯。
基本介紹
概念






求劃分個數
算法分析
















































JAVA實現
class Solution{
/**
* 正整數n,最大加數不大於m的劃分數
* @params {int}n 待劃分數
* @params {int}m 劃分序列中的最大數
* @returns {int} 返回本次劃分數
* /
public static int q(int n,int m){
//若正整數或最大加數小於1,則返回0
if(n<1||m<1) return 0;
//若正整數或最大加數等於1,則劃分個數為1(n個1相加)
if(n==1||m==1) return 1;
//若最大加數實際上不能大於正整數n,若大於則劃分個數等於最大加數為n的劃分個數
if(n<m) return q(n,n);
//若正整數等於最大加數,則劃分個數等於
if (n==m) return 1+q(n,n-1);
//若正整數大於最大加數 返回如下劃分結果
return q(n,m-1)+q(n-m,m);
}
public static void main(String[] args){
Solution solution = new Solution();
// 測試
solution.q(4,4) //返回結果為 5
}
}
C語言實現
#include<stdio.h>
void main()
{
int equation(int n,int m);
int n,m;
printf("Please input 'n'(0<n<100):");
scanf("%d",&n);
printf("Please input 'm'(0<m<=n):");
scanf("%d",&m);
printf("quantity:%d\n",equation(n,m));
}
int equation(int n,int m)
{
if(n==1||m==1)
return (1);
else if(n<m)
return equation(n,n);
else if(n==m)
return 1+equation(n,n-1);
else
return equation(n-m,m)+equation(n,m-1);
}
求具體劃分集合






#include<stdio.h>
int x[50]={0};
void main()
{
void split(int n,int k);
int n;
printf("Please input 'n'(0<n<100):");
scanf("%d",&n);
split(n,0);
}
void split(int n,int k)//k是數組中的位置,亦是遞歸層數
{
void display(int k);
int i;
if(n==0)//分解完成,輸出結果
display(k);
else
for(i=n;i>0;i--)
if(k==0||i<=x[k-1])
{
x[k]=i;//寫入數組
split(n-i,k+1);
}
}
//輸出數組前k項
void display(int k)
{
int i;
for(i=0;i<k;i++)
printf("%d ",x[i]);
printf("\n");
}

