题目连接:点击打开链接
刚从队友那学来的。
/*
Nyoj 90 整数划分.
题大意:把n划分成不大于m的种类有多少?
例如:整数6可以划分成(6)(5+1)(4+2)(4+1+1)(3+3)(3+2+1)(3+1+1+1)(2+2+2)(2+2+1+1)(2+1+1+1+1)(1+1+1+1+1+1)
思路:那么一个数n划分成不大于m的种类有多少种情况呢?
当n>m时,可以分成包含m和不包含m的.
当n==m时就是,把n分成不大于m-1的情况在加上一个n这种情况.
当n<m时就相当于把n分成不大于n的这种情况.
*/
//递归求解.
#include<stdio.h>
int fun(int n,int m)
{
if(n==1||m==1) return 1;
if(n<=m) return fun(n,n-1)+1;
if(n>m) return fun(n-m,m)+fun(n,m-1);
// if(n==m) return fun(n,m-1)+1;
}
int main()
{
int M;
scanf("%d",&M);
while(M--)
{
int n;
scanf("%d",&n);
printf("%d\n",fun(n,n));
}
return 0;
}
//递推法
#include<stdio.h>
#include<string.h>
const int N=12;
int Map[N][N];
void BuildMap()
{
memset(Map,0,sizeof(Map));
Map[1][1]=1;
for(int i=0;i<=10;i++)
for(int j=1;j<=10;j++)
if(i<=j) Map[i][j]=Map[i][i-1]+1;
else Map[i][j]=Map[i-j][j]+Map[i][j-1];
}
int main()
{
BuildMap();
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
printf("%d\n",Map[n][n]);
}
return 0;
}
//由于该题的数据只有10组,可以直接打表就可以.
#include<stdio.h>
const int f[12]={0,1,2,3,5,7,11,15,22,30,42};
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
printf("%d\n",f[n]);
}
}
不断的总结是不错的。