hdu-1028

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于hdu-1028的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1028 简单动态规划

*HDU 1028 母函数

HDU1028

hdu1028(母函数)

hdu1028

hdu 1028 整数的划分问题