nyoj 176 整数划分(二) 279 队花的烦恼(二)
2014-04-21 17:13
281 查看
整数划分(二)
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
把一个正整数m分成n个正整数的和,有多少种分法?
例:把5分成3个正正数的和,有两种分法
1 1 3
1 2 2
输入
第一行是一个整数T表示共有T组测试数据(T<=50)
每组测试数据都是两个正整数m,n,其中(1<=n<=m<=100),分别表示要拆分的正数和拆分的正整数的个数。
输出
输出拆分的方法的数目。
样例输入
2
5 2
5 3
样例输出
22
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> using namespace std; int part(int n,int m )//n个数,要分成m个 { if(n < m )//n<m 时,无法分 return 0; if(n==m || m==1)//如果m==n则分为n个1,1种分法 return 1;//如果m==1,分为1个数,也就是n本身,也是1种分法 return part(n-1,m-1)+part(n-m,m); /*分的结果中有没有 1 ,如果1,那么就把剩下的n-1分成m-1份; 如果没有1,先拿出m份,每份一个1,剩下n-m分成m分,加上原来分的1,则分出的m份每份不存在1 */ } int main() { int t,a,c; while(scanf("%d%d",&a,&c)!=EOF){ printf("%d\n",part(a,c)); } return 0; }
递归易超时
下面是dp,两题通用
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> using namespace std; int dp[510][105]; int main() { memset(dp,0,sizeof(dp)); dp[1][1]=1; for(int i = 2 ; i <= 500 ; i++) for(int j = 1 ; j <= i && j <=100; j++ ) dp[i][j]=dp[i-j][j]+dp[i-1][j-1]; int t,a,c; while(scanf("%d%d",&a,&c)!=EOF){ printf("%d\n",dp[a][c]); } return 0; }
相关文章推荐
- NYOJ 279 队花的烦恼二和NYOJ 176 整数划分(二)【dp问题或递归】
- nyoj 90 176 整数划分一 二 和 nyoj 279 队花的烦恼二
- 递归---NYOJ-176 整数划分(二)和NYOJ-279队花的烦恼二
- nyoj 176 整数划分(二)【dp】
- NYOJ-176整数划分(二)
- NYOJ 题目176整数划分(二)
- nyoj-176 整数划分(二) dp
- nyoj_176_整数划分(二)_201404261715
- NYOJ 176 整数划分(二)
- NYOJ 176 、POJ 1664 —— m划分为n个正整数的划分个数
- NYOJ 176 整数划分(二)
- NYOJ 176 整数划分(二) (dp)
- NYOJ 176 整数划分(二)
- nyoj 176— 整数划分(二)
- 【DP】NYOJ 176 整数划分(二)
- NYOJ 题目176整数划分(二)(递归)
- NYOJ176 整数划分(二)
- NYOJ176整数划分(二)
- nyoj 176 整数划分(二)
- NYOJ 176 整数划分(二)