整数划分问题

来源:互联网 发布:windows 7 系统 编辑:程序博客网 时间:2024/05/21 13:41

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

  题目:一个正整数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)。