HDU_1028_Ignatius and the Princess III_(母函数,dp)

Posted Jason333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU_1028_Ignatius and the Princess III_(母函数,dp)相关的知识,希望对你有一定的参考价值。

Ignatius and the Princess III

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17917    Accepted Submission(s): 12558


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
 
看了题解,学了两种方法。一种是母函数,一种是dp。
母函数:组合数学方法,第一次接触。
  此题构造的母函数(1+x^1+x^2+x^3...+x^n)(1+x^2+x^4+x^6...+x^2n).....
  第一项表示(0个1,1个1,2个1,3个1...),第二项表示(0个2,1个2,2个2,3个2,4个2...)以此类推。
  展开后,每一项的指数表示划分的这个数,系数表示该数的划分数。
import java.util.*;
import java.io.*;

public class Main {

    public static int cal(int n)
    {
        int c1[]=new int [n+1];
        int c2[]=new int [n+1];
        for(int i=0;i<=n;i++)
        {
            c1[i]=1;
            c2[i]=0;
        }
        for(int i=2;i<=n;i++)
        {
            for(int j=0;j<=n;j++)
                for(int k=0;k+j<=n;k+=i)
                    c2[j+k]+=c1[j];
            for(int j=0;j<=n;j++)
            {
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        return c1[n];
    }
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n;
        while(in.hasNext())
        {
            n=in.nextInt();
            System.out.println(cal(n));
        }
    }

}
View Code

dp:

dp[i][j]表示i这个数划分为最大加数不超过j的划分数。

if(i>j)  dp[i][j]=dp[i][j-1]+dp[i-j][j];

else if(i==j)   dp[i][j]=dp[i][j-1]+1;

else if(i<j)   dp[i][j]=dp[i][i];

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

int dp[150][150];

int main()
{
    int n,m;
        //dp[1][1]=1;
        for(int i=1; i<=150; i++)
            for(int j=1; j<=150; j++)
            {
                if(j==1)
                    dp[i][j]=1;
                else if(i==j)
                    dp[i][j]=dp[i][j-1]+1;
                else if(i>j)
                    dp[i][j]=dp[i][j-1]+dp[i-j][j];
                else if(i<j)
                    dp[i][j]=dp[i][i];
            }
        while(scanf("%d",&n)!=EOF)
        {
            printf("%d\\n",dp[n][n]);
        }


    return 0;
}
View Code

 

以上是关于HDU_1028_Ignatius and the Princess III_(母函数,dp)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1028 Ignatius and the Princess III

hdu 1028 Ignatius and the Princess III

HDU 1028 Ignatius and the Princess III (动态规划)

hdu 1028 Ignatius and the Princess III

HDU 1028: Ignatius and the Princess III

hdu 1028 Ignatius and the Princess III 母函数