hdu2082 找单词 母函数+完全背包两种算法AC。。数据较水

找单词

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 4615    Accepted Submission(s): 3304

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

Source

2006/1/15 ACM程序设计期末考试

简单题,不解释了

背包代码:

#include <stdio.h>
#include <string.h>
#define MAX 100
int dp[MAX] ;
int max(int a , int b)
{
	return a>b?a:b ;
}
int main()
{
	int t ;
	scanf("%d",&t) ;
	int v[30] ;
	while(t--)
	{
		memset(dp,0,sizeof(dp)) ;
		dp[0] = 1 ;
		for(int i = 0 ; i < 26 ; ++i)
		{
			scanf("%d",&v[i]) ;
		}
		for(int i = 0 ; i < 26 ; ++i)
		{
			for(int j = 50 ; j >= 0 ; --j)
			{
				for(int k = 1 ; k <= v[i] ; ++k)
				{
					if(j-k*(i+1)>=0)
						dp[j] += dp[j-k*(i+1)] ;
				}
			}
		}
		int sum = 0 ;
		for(int i = 1 ; i <= 50 ; ++i)
		{
			sum += dp[i] ;
		}
		printf("%d\n",sum) ;
	}
	return 0 ;
}

母函数代码:

#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
	int c1[MAX] , c2[MAX] , num[MAX];
	int t ;
	scanf("%d",&t) ;
	while(t--)
	{
		memset(c1,0,sizeof(c1)) ;
		memset(c2,0,sizeof(c2)) ;
		num[0] = 0 ;
		for(int i = 1 ; i <= 26 ; ++i)
		{
			scanf("%d",&num[i]) ;
		}
		for(int i = 0 ; i <= num[1] ; ++i)
		{
			c1[i] = 1 ;
		}
		for(int i = 2 ; i <= 26 ; ++i)
		{
			for(int j = 0 ; j <= 50 ; ++j)
			{
				for(int k = 0 ; k<=num[i]*i && k+j <= 50 ; k+=i)
				{
					c2[k+j] += c1[j] ;
				}
			}
			for(int j = 0 ; j <= 50 ; ++j)
			{
				c1[j] = c2[j] ;
				c2[j] = 0 ;
			}
		}
		int sum = 0 ;
		for(int i = 1 ; i <= 50 ; ++i)
		{
			sum += c1[i] ;
		}
		printf("%d\n",sum);
	}
	return 0 ;
}

与君共勉

时间: 2024-10-08 20:34:36

hdu2082 找单词 母函数+完全背包两种算法AC。。数据较水的相关文章

hdu 1162 Eddy&#39;s picture 最小生成树入门题 Prim+Kruskal两种算法AC

Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7428    Accepted Submission(s): 3770 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to

hdu2082 找单词 (母函数)

找单词 题意: 中文题,考虑是不是要写个英文题意..(可惜英语水平不够  囧rz)                (题于文末) 知识点: 母函数(生成函数): 生成函数有普通型生成函数和指数型生成函数两种(本题是普通型). 形式上,普通型母函数用于解决多重集的组合问题, 指数型母函数用于解决多重集的排列问题. 母函数还可以解决递归数列的通项问题(例如使用母函数解决斐波那契数列,Catalan数的通项公式). 普通母函数: 构造母函数G(x), G(x) = a0 + a1*x + a2* + a

hdu 1874 畅通工程续 两种算法AC Floyd+Bellman-Ford算法 又是一波水题~~

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 31655    Accepted Submission(s): 11564 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行

hdu 1217 Arbitrage 两种算法AC代码,Floyd+Bellman-Ford 大水题一枚 注意是有向图~~

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4998    Accepted Submission(s): 2286 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform

hdu 1863 畅通工程 最小生成树模板入门题 prim+kruskal两种算法AC。

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18866    Accepted Submission(s): 8012 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出

HDU 2082 找单词 --- 母函数

HDU 2082 找单词 起码通过这题,知道了母函数是什么东西,值得一做. /* HDU 2082 找单词 --- 母函数 */ #include <cstdio> #include <cstring> const int N = 50; int num[30], c1[N + 10], c2[N + 10]; int main() { #ifdef _LOCAL freopen("D:\\input.txt", "r", stdin); /

hdu2844 &amp; poj1742 Coin ---多重背包--两种方法

题意:你有N种硬币,每种价值A[i],每种数量C[i],问.在不超过M的情况下,我们用这些硬币,付款有多少种情况.也就是:1,2,3,4,5,....,M这么多种情况下,你能用你的硬币不找钱,付款多少种情况. 例如: 你有一种硬币,价值2,个数2,那么 你是不能付款 3元的..你只能付款2,或者4元.. OK,题意差不多就是这样啦. 那么这里有两种方式! 分析: 那么这里我们可以用多重背包来解决,我们把价值和重量看成一样的w[i] = A[i]:用M作为背包.那么dp 过后,我们就可以知道 dp

两种接口传送数据协议(xml和json)

规范性接口开发中,一般数据是以json或者xml的格式传送的,而不是字符串的形式直接返回给接口调用者:下面介绍这两种格式的编写方法. 下面两种数据传送方式是接口输出端的编写.需引入的包如下: <span style="font-family:KaiTi_GB2312;font-size:18px;">importjava.io.PrintWriter; importjava.io.StringWriter; importjavax.servlet.http.HttpServ

次小生成树的两种算法

一."换边"算法 用Kruskal求最小生成树,标记用过的边.求次小生成树时,依次枚举用过的边,将其去除后再求最小生成树,得出所有情况下的最小的生成树就是次小的生成树.可以证明:最小生成树与次小生成树之间仅有一条边不同. 这样相当于运行m次Kruskal算法. 复杂度O(m^2) 示例代码: int Kruskal_MinTree() { int u,v; init(); int i,flag,cnt; minedge = 0; flag = cnt = 0; int tmp = 0;