• 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): 4636 Accepted Submission(s): 3246


    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

    Author

    Ignatius.L
     
    母函数 模板题 详情

     1 #include<stdio.h>
    2 #include<string.h>
    3 int num_[121] , num[121] ;
    4 int main ()
    5 {
    6 int n ;
    7 while ( scanf ( "%d" , &n ) != EOF )
    8 {
    9 for ( int i = 0 ; i <= n ; ++ i )
    10 {
    11 num_[i] = 0 ;
    12 num[i] = 1 ;
    13 }
    14 for ( int i = 2 ; i <= n ; ++ i )
    15 {
    16 for ( int j = 0 ; j <= n ; ++ j )
    17 for ( int k = 0 ; k + j <= n ; k += i )
    18 {
    19 num_[j+k] += num[j] ;
    20 }
    21 for ( int j = 0 ; j <= n ; ++ j )
    22 {
    23 num[j] = num_[j] ;
    24 num_[j] = 0 ;
    25 }
    26 }
    27 printf ( "%d\n" , num[n] ) ;
    28 }
    29 return 0 ;
    30 }

     该题目还可以用完全背包写:

     1 #include<stdio.h>
    2 #include<string.h>
    3 int dp[121] , n ;
    4 void get_dp ()
    5 {
    6 memset( dp , 0 , sizeof (dp) ) ;
    7 dp[0] = 1 ;
    8 for ( int i = 1 ; i <= 120 ; ++ i )
    9 for ( int j = i ; j <= 120 ; ++ j )
    10 dp[j] += dp[j - i] ;
    11 }
    12 int main ()
    13 {
    14 get_dp() ;
    15 while ( scanf ( "%d" , &n ) != EOF )
    16 {
    17 printf ( "%d\n" , dp[n] ) ;
    18 }
    19 return 0 ;
    20 }

      

  • 相关阅读:
    IDEA安装scala搭建项目环境
    安装配置Maven和创建Java项目
    IDEA 2019.2的安装破解教程
    GroupBy
    C#快速傅立叶变换(Fast Fourier Transform)
    多种方式收费解决方案
    随机数生成算法
    C#生成随机数的三种方法
    统治世界的十大算法,你都了解多少?
    VR和AR技术是什么意思 二者有什么区别详解
  • 原文地址:https://www.cnblogs.com/jbelial/p/2117620.html
Copyright © 2020-2023  润新知