• HDU 1028 Ignatius and the Princess III(母函数)


    Ignatius and the Princess III

                    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

                           Total Submission(s): 9408    Accepted Submission(s): 6642

    Problem Description
    "Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says.
    "The second problem is, given an positive integer N, we define an equation like this:   N=a[1]+a[2]+a[3]+...+a[m];   a[i]>0,1<=m<=N; My question is how many different equations you can find for a given N. For example, assume N is 4, we can find:   4 = 4;   4 = 3 + 1;   4 = 2 + 2;   4 = 2 + 1 + 1;   4 = 1 + 1 + 1 + 1; so the result is 5 when N is 4. Note that "4 = 3 + 1" and "4 = 1 + 3" is the same in this problem. Now, you do it!"
     
    Input
    The input contains several test cases. Each test case contains a positive integer N(1<=N<=120) which is mentioned above. The input is terminated by the end of file.
     
    Output
    For each test case, you have to output a line contains an integer P which indicate the different equations you have found.
     
    Sample Input
    4
    10
    20
     
    Sample Output
    5
    42
    627
     
     
    题目分析:题目要求的是整数的拆分方案个数,用母函数处理。
     
    母函数详解链接:http://www.wutianqi.com/?p=596
     
     1 #include <stdio.h>
     2 
     3 int N;
     4 const int MAX_NUM = 125;
     5 int   solNum[MAX_NUM];
     6 int   temp[MAX_NUM];
     7 
     8 void InitGenerFun()
     9 {
    10     for(int i = 0; i < MAX_NUM; i++)
    11     {
    12         solNum[i] = 1;
    13         temp[i]   = 0;
    14     }
    15     for(int i = 2; i < MAX_NUM; i++)
    16     {
    17         for(int j = 0; j < MAX_NUM; j++)
    18         {
    19             for(int k = 0; k+j < MAX_NUM; k+=i)
    20             {
    21                 temp[k+j] += solNum[j];
    22             }
    23         }
    24         for(int k = 0; k < MAX_NUM; k++)
    25         {
    26             solNum[k] = temp[k];
    27             temp[k]   = 0;
    28         }
    29     }
    30 }
    31 
    32 int main()
    33 {
    34     InitGenerFun();
    35 
    36     while(scanf("%d", &N) != EOF)
    37     {
    38         printf("%d\n", solNum[N]);
    39     }
    40 
    41     return 0;
    42 }
  • 相关阅读:
    while循环
    赋值运算符、逻辑运算符补充
    布尔类型 基本运算符 if判断
    输入 格式化输出
    计算机基础
    python介绍 编程语言分类及对比 python解释器安装(多版本共存) 变量 数据类型(三种)
    UDP套接字协议
    软件工程个人作业01
    网页版增加信息---添加
    javaWeb项目技术
  • 原文地址:https://www.cnblogs.com/Dreamcaihao/p/3107204.html
Copyright © 2020-2023  润新知