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的主要内容,如果未能解决你的问题,请参考以下文章