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