题意: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
hdoj 2082 找单词 【母函数】,布布扣,bubuko.com
原文:http://blog.csdn.net/shengweisong/article/details/38533973