• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

母函数 HDU 2082 找单词

题意是,给出A~Z字母的个数,计算它们能组成单词的价值<=50的个数

也是母函数模板,判断时添加了一个最大值

#include<iostream>
using namespace std;

struct element
{
	int numvalue;
	int maxnum;
};
int main()
{
	int hold[26];
	element num[26];
	int tmp[100];
	int a[100];
	int N;
	int n;
	int sum;
	freopen("C:\\Users\\Haojian\\Desktop\\test.txt", "r", stdin);
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		n = 0;
		sum = 0;
		for (int i = 0; i < 100; i++)
		{
			tmp[i] = 0;
			a[i] = 0;
		}

		for (int i = 0; i < 26; i++)
		{
			cin >> hold[i];
			if (hold[i])
			{
				num[n].maxnum = hold[i];
				num[n].numvalue = i+1;
				n++;
			}//初始化,记录每个字母的价值和最大个数
		}
		
		for (int i = 0; i <= num[0].maxnum * num[0].numvalue; i += num[0].numvalue)
			tmp[i] = 1;

		//母函数
		for (int i = 2; i <= n; i++)
		{
			for (int j = 0; j <= 50; j++)
				//添加一个最大个数的判断
				for (int k = 0; k*(num[i-1].numvalue) + j <= 50 && k <= num[i-1].maxnum; k++)
					a[ k*(num[i-1].numvalue) + j] += tmp[j];

			for (int j = 0; j <= 50; j++)
			{
				tmp[j] = a[j];
				a[j] = 0;
			}
		}

		for (int j = 1; j < 51; j++)
			sum += tmp[j];
		cout << sum << endl;

	}
	return 0;
}

posted on 2010-09-25 11:11  sysuwhj  阅读(319)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3