HLG 1216 数的划分【母函数④】

 

Description
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
Input
有多则测试数据。
对于每组测试数据,仅有一行,包括两个整数n,k (6<n<=200,2<=k<=6)。
Output
对于每组测试数据,输出一个整数,即不同的分法。
Sample Input
7 3
Sample Output
4
Hint
输入: 7 3
输出:4 {四种分法为:1,1,5; 1,2,4; 1,3,3; 2,2,3;}

分析:此题和母函数①的不同之处在于划分数目是固定的,但是可以转化

比如,下图是10的几种划分方法:

  

把上图的三个矩形顺时针旋转90度后,如下图:

  

 

不难发现,选转之后的模型还是10的划分,不过约束条件有所不同。很明显,由于原来是k份划分,因此新的模型中的最大一个元素必然是k。而其余的元素大小不限,但都不能大于k.  n减去k后,n’=n-k,剩下的问题就是求n’的任意划分,且其中每个元素都不大于k的方案总数了。而求法可以用母函数,把步长限制在K以内。

View Code
#include<stdio.h>
int main()
{
int c1[201],c2[201];
int i,j,n,k,ka;
while(scanf("%d%d",&n,&ka)!=EOF)
{
n-=ka;
for(i=0;i<=n;i++)
{
c1[i]=1;
c2[i]=0;
}
for(i=2;i<=ka;i++)
{
for(j=0;j<=n;j++)
for(k=0;k+j<=n;k+=i)
c2[j+k]+=c1[j];
for(j=0;j<=n;j++)
{
c1[j]=c2[j];
c2[j]=0;
}
}
printf("%d\n",c1[n]);
}
return 0;
}




posted @ 2012-04-06 17:01  'wind  阅读(212)  评论(0编辑  收藏  举报