2348 - 数的划分
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5;
1,5,1;
5,1,1;
问有多少种不同的分法。
题目输入
每个测试文件只包含一组测试数据,每组输入两个整数n和k(6<n<=200,2<=k<=6)。
题目输出
对于每组输入数据,输出一个整数,即不同的分法。
下面是对样例数据的说明:
样例中的四种分法是:
1,1,5
1,2,4
1,3,3
2,2,3
输入/输出样例
题目输入
7 3
题目输出
4
C语言解答
#include <stdio.h> #include<string.h> int main() { int n,x,a[7][201],i,j; while(scanf("%d%d",&n,&x)!=EOF) { memset(a,0,sizeof(a)); for(j=0;j<=n;j++) a[1][j]=1; for(i=2;i<=x;i++) for(j=0;j<=n-x;j++) { if(j>=i) a[i][j]=a[i-1][j]+a[i][j-i]; else a[i][j]=a[i-1][j]; } printf("%d\n",a[x][n-x]); } return 0; }
C++解答
#include<iostream> #include<cstring> using namespace std; int count=0; void f(int n,int x,int mi) { if (n<mi) return ; if (x==1 && n>=mi) count++; else { int i; for (i=mi;i<=n/x;i++) f(n-i,x-1,i); } } int main() { int i,n,k,max; while ( cin>>n>>k){ count=0; // if (n%k==0) max=n/k-1; //else max=n/k; for (i=1;i<=max;i++) f(n-i,k-1,i); cout<<count<<endl;} return 0; }