1. 程式人生 > >演算法作業-整數劃分-母函式

演算法作業-整數劃分-母函式

正整數的劃分問題是將一個正整數n表示成一系列正整數之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。請編寫至少三種不同的求解演算法,並對所編寫演算法的時間效率進行測試和比較。

解法一:遞迴演算法

解法三:母函式演算法


xmk表示劃分中包含了mk的情況。正整數n的不同劃分個數的母函式為:


利用函式G(x)求出xn的係數即可。

演算法如下:

Java程式碼如下:

package integer_division;

public class Integer_division_3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long startTime = System.currentTimeMillis();
		System.out.println(p(120));//列印120的劃分種類數
		long endTime = System.currentTimeMillis();
		System.out.println("程式執行時間:"+(endTime - startTime) + "ms");
	}

	public static int p(int n) {
        int[] c1 = new int[n+1];
        int[] c2 = new int[n+1];
        for(int i=0; i<=n; i+=1) {
            c1[i] = 1;
            c2[i] = 0;
        }
        for(int i=2; i<=n; i+=1) {
            for(int j=0; j<=n; j+=1) {
                for(int k=0; k+j<=n; k+=i) {
                    c2[j+k] += c1[j];
                }
            }
            for(int j=0; j<=n; j+=1) {
                c1[j] = c2[j];
                c2[j] = 0;
            }
        }
        return c1[n];
	}

}

對程式碼進行例項測試的結果如下:((a,b,c)中a表示正整數,b表示劃分結果個數,c表示程式的執行時間,單位是毫秒)

(10,42,1)

(30,5604,1)

(50,204226,1)

(70,4087968,1)

(80,15796476,1)

(90,56634173,1)

(100,190569292,1)

(110,607163746,1)

(後面的測試例項劃分結果數目過多,故不展示劃分結果數目)

(200,-,3)

(300,-,5)

(400,-,6)

(600,-,8)

(800,-,10)

(1000,-,14)

(1200,-,17)


該演算法的時間複雜度為O(n2lnn)。