HDU 2082 找单词 (普通母函数)
Problem Description
假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26。那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是组成一个单词的所有字母的价值之和,比如,单词ACM的价值是1+3+14=18,单词HDU的价值是8+4+21=33。(组成的单词与排列顺序无关,比如ACM与CMA认为是同一个单词)。
Input
输入首先是一个整数N,代表测试实例的个数。
然后包括N行数据,每行包括26个<=20的整数x1,x2,.....x26.
Output
对于每个测试实例,请输出能找到的总价值<=50的单词数,每个实例的输出占一行。
Sample Input`
2
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
9 2 6 2 10 2 2 5 6 1 0 2 7 0 2 2 7 5 10 6 10 2 10 6 1 9`
Sample Output`
7
379297`
题目分析:
默认从A到Z这26个英文字母的权重为1到26,依次输入26个数字,分别代表从A到Z这26个字母的个数。从这些子母中找出一些组成单词,一个单词的权重为其中每个单词的权重之和,但是组成的单词与排列顺序无关,要求组成单词的权重不大于50.
这就是一个普通的母函数的应用,关于母函数的知识可以具体见上一篇博客。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
int c1[100],c2[100];
int main()
{
vector<int> num;
vector<int> qz;
int T;
scanf("%d",&T);
while(T--)
{
num.clear();
qz.clear();
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
int temp;
for(int i=1; i<=26; i++)
{
scanf("%d",&temp);
if(temp!=0)
{
num.push_back(temp);///当前的个数不为0时,就把当前这个字母对应的权重和个数分别存下
qz.push_back(i);
}
}
int n=num.size();
if(n==0) ///当前所有的字母个数都为0的话,就没有计算的必要了,直接输出0
printf("0\n");
else
{
for(int i=0; i<=50&&i<=num[0]*qz[0]; i+=qz[0])/*第一个字母,关键在于i的控制,i表示的是权重的累加和
不仅要小于要求50,还得小于当前字母个数的总权重
*/
c1[i]=1;
for(int i=1; i<n; i++) ///从第二个字母开始循环
{
for(int j=0; j<=50; j++) ///表示当前已经拥有的权重
{
for(int k=0; k<=50&&k<=num[i]*qz[i]; k+=qz[i])///在该字母上可以取得的权重,满足条件和第一个字母一样
c2[k+j]+=c1[j]; ///该权重下的个数刷新
}
for(int p=0; p<=50; p++)///每一个字母找玩后都要保存并c2初始化
{
c1[p]=c2[p];
c2[p]=0;
}
}
int sum1=0;
for(int i=1; i<=50; i++)
sum1+=c1[i];
printf("%d\n",sum1);
}
}
}
HDU 2082 找单词 (普通母函数)的更多相关文章
- HDU 2082 找单词 (普通型 数量有限 母函数)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2082 找单词 Time Limit: 1000/1000 MS (Java/Others) Me ...
- HDU 1028 整数拆分 HDU 2082 找单词 母函数
生成函数(母函数) 母函数又称生成函数.定义是给出序列:a0,a1,a2,...ak,...an, 那么函数G(x)=a0+a1*x+a2*x2+....+ak*xk +...+an* xn 称为序 ...
- HDU——2083找单词(母函数)
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...
- HDU 2082 找单词 (多重背包)
题意:假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的 ...
- HDU 2082 找单词
Problem Description 假 设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字 ...
- HDU 2082 找单词 --生成函数
跟上题是一个思路:http://www.cnblogs.com/whatbeg/p/3728545.html 只不过是上一题的扩展. 代码: #include <iostream> #in ...
- hdu acm 2082 找单词
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDOJ 2082 找单词 (母函数)
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU2082 找单词 【母函数】
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
随机推荐
- maven Web项目中POM的配置信息
什么是POM? POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml.在Maven中,当谈到Project的时候, ...
- BZOJ 2141 排队(树状数组套主席树)
解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...
- Jstack、Jmap命令简单使用
TOMCAT_ID为tomcat的进程号. 1.使用jstack查看jvm堆栈信息. /bin/ TOMCAT_ID:无法输出到单独的文件中,只能在tomcat的启动文件中打印相关的堆栈信息. jst ...
- KMPnext数组自看
emm...无数次再看kmp了 因为一直没做相关的题..看了就忘看了就忘..emm.. next[i]表示去掉第i个元素后,自已的前缀和后缀完全匹配的最大长度 例 字符串 a b a b a b z ...
- Now or later UVALive - 3211(2-SAT 最小值最大化)
emmm...去吃早饭了... rujia讲的很好.. 最小值最大化问题,,,二分枚举答案 设x1.x2为同一个集合中的元素,y1.y2为另一个集合中的元素,如果x1与y1之差小于mid,那么如果 ...
- 【BZOJ3242】【NOI2013】快餐店(动态规划)
[BZOJ3242][NOI2013]快餐店(动态规划) 题面 BZOJ 题解 假设我们要做的是一棵树,那么答案显然是树的直径的一半. 证明? 假设树的直径是\(2d\),那么此时最远点的距离是\(d ...
- CF785D Anton and School - 2 解题报告
CF785D Anton and School - 2 题意:给定一个长度\(\le 2 \times 10e5\)由'('和')'组成的字符串,问有多少个子串(可以不连续),前半部分是由\('('\ ...
- bzoj2396: 神奇的矩阵(矩阵乘法+随机化)
这题n三方显然会GG... 运用矩阵乘法的性质A*B*R=A*(B*R)=C*R,于是随机化出一个一列的R,就可以把复杂度降低成n方...大概率是不会错的 #include<iostream&g ...
- [ACM][2018南京预赛]Sum
一.题面 样例输入: 2 5 8 样例输出: 8 14 二.思路 关键词:线性筛 在Zed的帮助下知道了这是一道线性筛的比较裸的题了.考试过程中肝这道题的时间最久,费了心思找到递推式后,发现根本不是在 ...
- 【bzoj4212】神牛的养成计划
Portal --> bzoj4212 Description 给你\(n\)个字符串,接下来有\(m\)个询问,每个询问由两个给定的字符串\(s_1\)和\(s_2\)组成,对于每个询问输 ...