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;
}
时间限制 1 秒
内存限制 125 MB
讨论 统计
上一题 下一题