算法作业-整数划分-母函数

正整数的划分问题是将一个正整数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)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值