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): 15730    Accepted Submission(s): 11092

    链接: hdu 1028

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

题意

题意:赤裸裸的整数划分,求N的划分成1~N中的数的和的形式的个数。

分析

整数划分的题目有很多种解决的方法,有DP的解法,有也完全背包的解法。这里仅给出一个递归的解法,用dp[n][m]表示整数N的划分中最大的为m的方法数,那么有dp[n][m] = Dp[n, m]= 1;                                 (n=1 or m=1) Dp[n, n];                                  (n<m) 1+ dp[n, m-1];                              (n=m) Dp[n-m,m]+dp[n,m-1];                              (n>m) 这里链接大牛们的其他做法: 母函数 、 递归 完全 背包

参考代码

#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#define FIN             freopen("input.txt","r",stdin)
#define FOUT            freopen("output.txt","w",stdout)
#define CASE(T)         for(scanf("%d",&T);T--;)
const int maxn = 120 + 5;
int dp[maxn][maxn];
int dfs(int n, int m)
{
    if(dp[n][m] != -1)      return dp[n][m];
    if(n < 1 || m < 1)      return dp[n][m] = 0;
    if(n == 1 || m == 1)    return dp[n][m] = 1;
    if(n < m)               return dp[n][m] = dfs(n, n);
    if(n == m)              return dp[n][m] = dfs(n, m - 1) + 1;
    return dp[n][m] = dfs(n, m - 1) + dfs(n - m, m);
}
int main()
{
//    FIN;
    int N;
    while(~scanf("%d", &N))
    {
        printf("%d\n", dfs(N, N));
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 19:29:15

hdu 1028 Ignatius and the Princess III 【整数划分】的相关文章

hdu 1028 Ignatius and the Princess III —— 整数划分(生成函数)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028 整数划分,每个数可以用无限次: 所以构造 f(x) = (1+x+x2+x3+...)(1+x2+x4+...)(1+x3+x6+...)...(1+xn) 乘起来后的 xn 的系数就是方案数: 用两个数组做即可,从第一个括号开始一个一个乘,f[i] 表示此时 xi 项的系数,后面每乘过来一个括号,相当于多了一种转移,所以加上. 代码如下: #include<iostream> #include

hdu 1028 Ignatius and the Princess III(整数划分)

题目链接 经典DP 整数划分问题 用动态规划递推 设dp[i][j]表示拆分数i,最大的那么数字不超过j的方案数. 第一种是最后一个数不超过j-1,此时方案数为dp[i][j-1],否则最后一个数字刚好是j,此时的方案数是dp[i-j][j]. 注意一些边界的情况. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <string> 5 #include <

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): 12731    Accepted Submission(s): 8999 Problem Description "Well, it seems the first problem is too easy. I will let

hdu 1028 Ignatius and the Princess III(母函数,完全背包)

http://acm.hdu.edu.cn/showproblem.php?pid=1028 整数划分问题. 第一道母函数...母函数入门 小于等于n的整数共有n个,1,2......n,每个数都有无限多个,对于整数1,它所对应的母函数为(1+x+x^2+...+x^k+...),整数2对应的母函数为(1+x^2+X^4+...+x^(2*k)+...),整数3对应的母函数为(1+x^3+x^6+...+x^(3*k)+...),以此类推,直到整数n. 那么n的整数划分的个数就是这n个母函数乘积

hdu 1028 Ignatius and the Princess III 简单dp

题目链接:hdu 1028 Ignatius and the Princess III 题意:对于给定的n,问有多少种组成方式 思路:dp[i][j],i表示要求的数,j表示组成i的最大值,最后答案是dp[i][i].那么dp[i][j]=dp[i][j-1]+dp[i-j][i-j],dp[i][j-1]是累加1到j-1的结果,dp[i-j][i-j]表示的就是最大为j,然后i-j有多少种表达方式啦.因为i-j可能大于j,这与我们定义的j为最大值矛盾,所以要去掉大于j的那些值 /*******

HDU 1028 Ignatius and the Princess III dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028 一道经典题,也是算法设计与分析上的一道题,可以用递推,动态规划,母函数求解,我用的是动态规划,也就是递推的变形. dp[i][j]表示数i的划分中最大数不超过j的划分的个数 状态转移方程: if(j > i) dp[i][j] = dp[i][i]; if(j == i) dp[i][j] = dp[i][j - 1] + 1; if(j < i) dp[i][j] = dp[i][j -

HDU 1028.Ignatius and the Princess III【分析】【8月20】

Ignatius and the Princess III 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

(简单母函数模板)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): 14405    Accepted Submission(s): 10142 Problem Description "Well, it seems the first problem is too easy. I will le

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): 15794    Accepted Submission(s): 11138 Description "Well, it seems the first problem is too easy. I will let you kno