遇到一指数型生成函数的运用实例:问题链接
排列组合
巧妙的运用了指数型的生成函数的系统来求去重的排列数!
code:
#include<stdio.h>
#include<string.h>
#define nmax 11
int num[nmax];
double fac[11]={1,1,2,6,24,120,720,5040,40320,362880,3628800},c1[nmax], c2[nmax];
int main()
{
int i, j, k, n, m;
while (scanf("%d %d", &n, &m) != EOF)
{
for (i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
memset(c1, 0.0, sizeof(c1));
memset(c2, 0.0, sizeof(c1));
for (i = 0; i <= num[0]; i++)
{
c1[i] = 1.0 / fac[i];
}
for (i = 2; i <=n; i++)
{
for (j = 0; j <= m; j++)
{
for (k = 0; (k <= num[i-1]) && (k + j <= m); k++)
{
c2[j + k] += c1[j] / fac[k];
}
}
for (j = 0; j <= m; j++)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
printf("%.0lf\n", c1[m] * fac[m]);//还原
}
return 0;
}
多说一些:和整数类型的生成函数的实现差不多,比如请看
这一篇,再想想;好像和那个什么背包问题又有相似的地方!可以从数学中的排列组合的意义中去考虑!