频道栏目
首页 > 资讯 > C++ > 正文

HDU 1085 Holding Bin-Laden Captive!(母函数)

14-05-26        来源:[db:作者]  
收藏   我要投稿

HDU 1085 Holding Bin-Laden Captive!(母函数)

题目地址

题意:
给你cnt1个一元硬币,cnt2个两元硬币,cnt3个五元硬币,问不能凑出来的第一个面额是多少。

分析:
母函数,公式为
(1+x+x^2+x^3+.........x^cnt1)?(1+x^2+x^4+x^6+.........x^cnt2)?(1+x^5+x^10+x^15+............x^cnt5)
直接模拟即可。

代码:

/*
*  Author:      illuz 
*  File:        1085.cpp
*  Create Date: 2014-05-25 11:34:37
*  Descripton:  Generating Function
*/

#include 
#include 

const int N = 1e4;
int val[3] = {1, 2, 5}, cnt[3];
int c1[N], c2[N], mmax;

int main()
{
	while (~scanf("%d%d%d", &cnt[0], &cnt[1], &cnt[2]) && (cnt[0] || cnt[1] || cnt[2])) {
		memset(c1, 0, sizeof(c1));
		memset(c2, 0, sizeof(c2));

		mmax = 0;
		for (int i = 0; i < 3; i++)
			mmax += cnt[i] * val[i];

		for (int i = 0; i <= cnt[0]; i++)	// 处理第一种硬币
			c1[i] = 1;

		for (int i = 1; i < 3; i++) {	// 对于1后面的每种硬币
			for (int j = 0; j <= mmax; j++) {
				if (c1[j] != 0) {	// 对于之前的项(c1)
					for (int k = 0; k <= val[i] * cnt[i]; k += val[i]) {	// 模拟与当前项式相乘
						if (j + k <= mmax)
							c2[j + k] += c1[j];
					}
				}
			}
			// 把当前项保存在c1,清空c2
			memcpy(c1, c2, sizeof(c1));
			memset(c2, 0, sizeof(c2));
		}

		int i;
		for (i = 0; i <= mmax; i++) {
			if (c1[i] == 0)
				break;
		}
		printf("%d\n", i);
	}
	return 0;
}


相关TAG标签
上一篇:Java数据结构学习笔记之栈和队列以及线性表的区别
下一篇:每日算法之十六:4sum
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站