数的划分
题目描述
 将整数 分成 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:,下面三种分法被认为是相同的:
1,1,5; 1,5,1; 1,1,5.
问有多少种不同的分法。
输入格式
 两个整数, 和 。
输出格式
 输出不同的分法数。
样例
 输入样例
 7 3
 输出样例
 4
 样例说明
 四种分法为:1,1,5; 1,2,4; 1,3,3; 2,2,3.
数据范围与提示
 对于 100% 的数据6≤n≤200,2≤k≤6。
解题思路
设f(i,j)为i分成j份的方案数
 初值:
 当j=1以及i=j时f(i,j)=1
 递推:
 两种情况
1.j份中至少一个是1,方案数为f(i-1,j-1)
2.j份中一份1都没有,考虑将i-j分为j份,再往j份中的每一份+1,方案数为f(i-j,j)
故有递推式:
  f ( i , j ) = f ( i − 1 , j − 1 ) + f ( i − j , j ) f(i,j)=f(i-1,j-1)+f(i-j,j) f(i,j)=f(i−1,j−1)+f(i−j,j)
AC代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,f[205][10];
int main()
{
   
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=min(i,k);j++)
	  if(j==1||i==j)f[i][j]=1;//初值
	  else f[i][j]=f[i-j][j]+f[i-1][j-1];//递归
	printf("%d",f[n][k]);  
 	return 0;
}
  
京公网安备 11010502036488号