地址
http://acm.hdu.edu.cn/showproblem.php?pid=2082
定位
排列组合问题
母函数
分析
物品种类数 N=26 ,第 i 种物品数量
xi ,第 i 种物品价值i 。母函数
g(x)=(1+x1+...+xx1)(1+x2+...+x2x2)...(1+xi+...+xixi)...(1+x26+...+x26x26)
代码
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- using namespace std;
- int a[1001],b[1001];
- int v[27],n1[27],n2[27];
- /*************************************************
- Function: GenerateFunc(int N,int P)
- Description: 生成函数系数计算
- Input: int N : 相乘的因子个数
- int P : 待求的最大指数
- Output: void
- Return: void
- Others: 修改的全局变量 a[] b[]
- 只读的全局变量 v[] n1[] n2[]
- *************************************************/
- void GenerateFunc(int N,int P) {
- memset(a,0,sizeof(a));
- a[0]=1;
- for(int i=0; i<N; i++) {
- memset(b,0,sizeof(b));
- for(int j=n1[i]; j<=n2[i]&&j*v[i]<=P; j++) {
- for(int k=0; k+j*v[i]<=P; k++) {
- b[k+j*v[i]]+=a[k];
- }
- }
- memcpy(a,b,sizeof(b));
- }
- }
- int main() {
- int N,sum;
- for(int i=0; i<26; i++) {
- v[i]=i+1;
- }
- memset(n1,0,sizeof(n1));
- scanf(”%d”,&N);
- while(N–) {
- sum=0;
- for(int i=0; i<26; i++) {
- scanf(”%d”,&n2[i]);
- }
- GenerateFunc(26,50);
- for(int i=0; i<=50; i++) {
- sum+=a[i];
- }
- printf(”%d\n”,sum-1);
- }
- }
性能
Exe.Time | Exe.Memory | Code Length | Language |
---|---|---|---|
15MS | 1876K | 1265B | c++ |
总结
- 方案数 sum−1
结合输入输出示例,发现空单词不属于接受方案,应予排除。
- 最后一行的输出格式
题目要求每行输入一个结果,特意在最后一个结果后不输出换行符,导致 Presentation Error。因此,每个结果后伴随输出换行符就行了,不必对最后一行特别处理。