整數劃分:
正整數n表示成一系列正整數之和:
n=n1+n2+n3...+nk(其中,n1>=n2>=n3...>=nk>=1,k>=1),p(n)就是正整數n的不同劃分個數,即正整數的劃分數。
那麼在正整數n的所有不同劃分中,把最大加數不大於m的劃分個數記作q(n,m)。那麼其遞迴關係如下:
(1)q(n,1)=1,n>=1
其中m=1,即最大加數只能為1,劃分情況只有一種:n=1+1+1+.....+1;
(2)q(n,m)=q(n,n),m>=n
由於最大加數大於等於正整數n,所有最大加數只能是n;
(3)q(n,n)=1+q(n,n-1)
最大加數為n時,只有一種情況。剩下的是最大加數為n-1時的劃分數;
(4)q(n,m)=q(n,m-1)+q(n-m,m) ,n>m>1
當正整數n大於最大加數m時,q(n,m-1)表示最大加數小於等於m-1時的劃分數,那麼再加上最大加數為m時的劃分數。最大加數為m時,最大加數已經固定了,剩下的就是正整數n減去最大加數m剩下的整數n-m的劃分數,即q(n-m,m)。
程式:
import java.util.Scanner;public class IntDivision {/** * 正整數n表示成一系列正整數之和: * n=n1+n2+n3...+nk(其中,n1>=n2>=n3...>=nk>=1,k>=1) * p(n)就是正整數n的不同劃分個數,即正整數的劃分數 */int intdivision(int n,int m){if (n<1||m<1) return 0;if(n==1||m==1) return 1;if(n<m) return intdivision(n, n);if(n==m) return intdivision(n, m-1)+1;return intdivision(n, m-1)+intdivision(n-m, m);}public static void main(String[] args) {Scanner in=new Scanner(System.in);System.out.print("輸入需要劃分的正整數");int n=in.nextInt();System.out.print("輸入最大加數");int m=in.nextInt();IntDivision id=new IntDivision();System.out.println("整數"+n+"在最大加數為"+m+"的情況下"+"的劃分數是:"+id.intdivision(n, m));}}