整数划分问题

  现在偶尔写一段代码,用于解决一个简单的题目。因为程序太短,没有必要保存到自己的计算机中,就想放到博客上,与大家一起分享。今日的程序是整数划分问题:

  题目:一个正整数n可以划分为多少种和的方式?

  例如5 可以划分为7种。

    5 = 1  + 1 + 1 + 1 + 1

           1 + 1 + 1 + 2

           1 + 1 + 3

           1 + 4

            1 + 2 + 2

            2 + 3

            5

   (不考虑次序)

代码如下:

#include <stdio.h>
/*
     input : 5
     output : 7
     because : 
          5 = 
                1 + 1 + 1 +  1 + 1
                1 + 1 + 1 + 2
                1 + 1 + 3
                1 + 4
                1 + 2 + 2
                2 + 3
                5
     7 splits kinds;
 */

int store_results[1024];
int f(int t, int k) {
	int m;
	int result;
	/*result = g(t - k);*/ 
	result = store_results[t - k];
	
	if (0 >= t || t < k)
		return 0;
	
	for (m = 1; m <= k - 1; ++m) {
		result  -= f(t - k, m);
	}
	return result;
}

int g(int t) {
	int k;
	int result = 0;
	if (0 == t)
		return 1;
	for (k = 1; k <= t; ++k) {
		result += f (t, k);
	}
	store_results[t] = result;
	return result;
}

int main() {
	int number;
	store_results[0] = 1;
	for (number = 1; number < 100 * 3; ++number) {
		fprintf(stdout, "all splits of %d : %d\n", number, g(number));
	}
	return 0;
}

采用递归求解方式,同时为了提高速率,记录了其中的g。若要进一步提高速度,还可以记录f(t, k)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值