首页 > 代码库 > hdoj 2082 找单词 【母函数】

hdoj 2082 找单词 【母函数】

题意:a~z的价值分别是1~26,给出你a~z的个数,问最多能组成价值不同的种类数。

策略:母函数。

典型的母函数题,但是这是属于给你有限个数目的题,要小心。

直接上代码:

#include<string.h>
#include<stdio.h>
int ans[55];
int c1[100], c2[100];
int main()
{
	int a[27], t, i, j, k;
	scanf("%d", &t);
	while(t --){
		memset(c1, 0, sizeof(c1));//初始化
		memset(c2, 0, sizeof(c2));
		for(i = 1; i <= 26; i ++){
			scanf("%d", &a[i]);
		}
		c1[0] = 1;价值为0的种类初始化为1
		for(i = 1; i <= 26; i ++){
			if(a[i] == 0){ //跳过数目为0的
				continue;
			}
			for(j = 0; j <= 50; j ++){  //突然想到这里的j为什么要小于等于50呢?仔细分析了一下,应该是某一循环的时候可能的j+k要大于a[i]*i, 同时因为只求50以内的, 所以只需要小于等于50就好了
				for(k = 0; j+k <= 50&&k<=a[i]*i; k += i){ //这里的k <= a[i]*i, 意思是表示a[i]个价值为i的字母的组成的最大价值
					c2[j+k] += c1[j];
				}
			}
			for(j = 0; j <= 50; j ++){
				c1[j] = c2[j];
				c2[j] = 0;
			}
		}
		int ans= 0;
		for(i = 1; i <= 50; i ++){
			ans+= c1[i];
		}
		printf("%d\n", ans);
	}
	return 0;
} 
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2082