hdu-1028

一、递归

构造一个函数fun(int n,int m);

n表示输入的N,m表示组成N中的任意一个小项不超过m;

4 = 4;
  4 = 3 + 1;
  4 = 2 + 2;
  4 = 2 + 1 + 1;
  4 = 1 + 1 + 1 + 1;

分情况

  1 m>n  例:fun(4,6)=fun(4,4);

    fun(n,m)=fun(n,n);

  2 m=n 例: fun(4,4)=1+fun(4,3);  要么小项中有4(此时只有一种情况),要么没有;

    fun(n,m)=1+fun(n,m-1);

  3 m<n 例:   fun(4,2)=fun(2,2)+fun(4,1); 要么小项中有2(此时剩下4-2=2),要么没有2;

    fun(n,m)=fun(n-m,m)+fun(n,m-1);  

  4 递归结束标志

    n=1或m=1 此时为1;

#include <stdio.h>

int fun1(int n,int m){
    if(n==1||m==1) return 1;
    else if(m>n) return fun1(n,n);
    else if(m==n) return fun1(n,m-1)+1;
    else return fun1(n-m,m)+fun1(n,m-1);
}
int main(int argc, char *argv[]) {
    int n;
    while(~scanf("%d",&n)){
        printf("%d\n",fun1(n,n));
    }

    return 0;
}

发现超时;

改进

#include <stdio.h>
#include<string.h>

int a[130][130];//dp方法

int fun1(int n,int m){
    if(a[n][m]!=-1) return a[n][m];
    else if(n==1||m==1) return a[n][m]=1;
    else if(m>n) return a[n][m]=fun1(n,n);
    else if(m==n) return a[n][m]=fun1(n,m-1)+1;
    else return a[n][m]=fun1(n-m,m)+fun1(n,m-1);
}
int main(int argc, char *argv[]) {
    int n;
    memset(a,-1,sizeof(a));
    while(~scanf("%d",&n)){
        printf("%d\n",fun1(n,n));
    }

    return 0;
}
时间: 2024-10-12 06:41:25

hdu-1028的相关文章

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 【整数划分】

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(

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的那些值 /*******

ACM: HDU 1028 Ignatius and the Princess III-DP

HDU 1028 Ignatius and the Princess III Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description "Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says. &qu

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 (动态规划)

题目链接: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

HDU 1028 整数划分问题 DP

http://acm.hdu.edu.cn/showproblem.php?pid=1028 将一个正整数n划分成多个正整数的和,例如4可以划分为4,1 + 3,2 + 2,1 + 1 + 2, 1 + 1 + 1(1 + 3和3 + 1算作一种划分). 在网上找到了两种做法 方法1: dp[i][j] 的含义是将一个正整数i划分为j个整数的和有几种分法.转移方程很好写但是不太好想. 将此划分分为两种情况,划分中包括1和不包括1.若划分中包括1,则只需将剩余的整数i - 1划分成j - 1个整数

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 —— 整数划分(生成函数)

题目: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,整数拆分的理解

#include"iostream"using namespace std;int main() { int n,i,j,k; int c[122],temp[122]; //c[] 数组用于储存当前多项式各项系数 //temp[]数组用于暂时储存在运算时的两多项式相加的系数和 while(cin>>n&&n!=0) { for(i=0;i<122;i++) //系数初始化,当前c[]所指的多项式是第一个多项式 {c[i]=1; temp[i]=0;}