hdu1085Holding Bin-Laden Captive!组合问题
题目连接
题目意思:有单位价值为1 2 5的三种硬币,分别给出他们的数量,求用这些硬币不能组成的最小的价值
解题思路:普通的母函数
普通的母函数:
利用母函数的思想可以解决很多组合问题,下面举例说明:
1.口袋中有白球2个,红球3个,黄球1个,从袋中摸出3个球有几种取法?
和上面描述的例子类似,我们可以用次数代表球的个数,多项式的每一项前面的系数代表取法的种树。
可以很容易地写出下面这个式子:
(1+x+x2)(1+x+x2+x3)(1+x)
(1+x+x2)表示有白球2个,1(1可以看做是x的0次方)表示白球不取,x代表取1个白球,x2代表取2个白球,即用x的次数表示取球的个数,后面的也是类似。那么这个多项式的乘积就把所有的情况都表示出来了,对于最终乘积的每一项anxn,表示取n个球有an种取法。
2.有若干个1克,2克,5克的砝码,要称出20克的重量,有多少种称法?
这里不限制砝码的个数,无所谓,照样写出母函数:
(1+x+x2+x3+......xk+....)(1+x2+x4+x6......+x2n+......)(1+x5+x10+......x5m+......)
因为要称出20克,所以只需要找找到结果中次数为20 的那一项就可以得到结果。
3.同样对于正数划分也可以解决,比如有整数20,划分成1,2,5,有多少种划分方法?
解法和2的类似。
还有一类题目和这类似,有n个球放到m个盒子中,有多少种不同的放法?
(1+x+x2+x3+...xk+...)(1+x+x2+x3+...xk+...)(1+x+x2+x3+...xk+...)总共有m项,然后找出乘积中次数为n的那一项系数。
代码实现:
模拟多项式的乘积过程,c[i]表示次数为i的系数,成tempc[]数组是一个暂存数组
该题的母函数不难得出是(1+x+x2+x3+......xk+....)(1+x2+x4+x6......+x2n+......)(1+x5+x10+......x5m+......)
对于单位价值为1的硬币,不去次数为0,取一个次数为1,取两个次数为2.。。。。。
对于单位价值为2的硬币,不去次数为0,取一个次数为2,取两个次数为4.。。。。。
对于单位价值为5的硬币,不去次数为0,取一个次数为5,取两个次数为10.。。。。。
普通母函数的精髓就是将组合问题通过次数及系数来表示在某次组合中的选择是怎样的,如分别选择多少个什么种类的东西
c[]数组初始化为第一个多项式乘积因子(1+x+x2+x3+......xk+....)的相应次数的系数
tempc[]数组暂存多项式乘积因子(1+x+x2+x3+......xk+....)与多项式乘积因子(1+x2+x4+x6......+x2n+......)相乘后相应的次数的系数,并赋给c[]数组。
注意:此时c[]数组存储的是多项式乘积因子(1+x+x2+x3+......xk+....)与多项式乘积因子(1+x2+x4+x6......+x2n+......)相乘后相应的次数的系数。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int main() 8 { 9 int cent[3]={1,2,5}; 10 int i,j,k,num[3],c[8005],tempc[8005]; 11 while(~scanf("%d%d%d",&num[0],&num[1],&num[2])) 12 { 13 if(num[0]==0&&num[1]==0&&num[2]==0)break; 14 int max=num[0]+num[1]*2+num[2]*5; 15 memset(c,0,sizeof(c)); 16 memset(tempc,0,sizeof(tempc)); 17 for(i=0;i<=num[0]*cent[0];i+=cent[0]) 18 c[i]=1; 19 for(i=1;i<3;i++) 20 { 21 for(j=0;j<=max;j++) 22 for(k=0;k+j<=max&&k<=cent[i]*num[i];k+=cent[i]) 23 tempc[k+j]+=c[j]; 24 for(j=0;j<=max;j++) 25 { 26 c[j]=tempc[j]; 27 tempc[j]=0; 28 } 29 } 30 for(i=0;i<=max;i++) 31 { 32 if(c[i]==0)break; 33 } 34 printf("%d\n",i); 35 } 36 return 0; 37 }
转载于:https://www.cnblogs.com/WHLdbk/p/6361362.html
hdu1085Holding Bin-Laden Captive!组合问题相关推荐
- google 使用技巧(转载)
GOOGLE搜索从入门到精通 GOOGLE搜索从入门到精通v3.0(注:本文提到的"英文字符"是指在输入法为英文的状态下所输入的字符) 11/2/2000 donquix@sina ...
- GOOGLE搜索从入门到精通v3.0 from:http://www.being.org.cn/tool/google.htm
GOOGLE搜索从入门到精通v3.0 原文:http://www.lasg.ac.cn/docs/googlebook.html 作者:donquix 内容 1,前言 2,摘要 3,如何使用本文 4, ...
- [推荐]GOOGLE搜索从入门到精通v3.0
作者:donquix (donquix@sina.com) ------------------------------ 内容 1,前言 2,摘要 3,如何使用本文 4,GOOGLE简介 5,搜索入门 ...
- GOOGLE搜索从入门到精通v3.0
内容 1,前言 2,摘要 3,如何使用本文 4,GOOGLE简介 5,搜索入门 6,初阶搜索 6.1,搜索结果要求包含两个及两个以上关键字 6.2,搜索结果要求不包含某些特定信息 6.3,搜索结果至少 ...
- 用主题模型可视化分析911新闻(Python版)
本文由 伯乐在线 - 东狗 翻译,toolate 校稿.未经许可,禁止转载! 英文出处:blog.dominodatalab.com.欢迎加入翻译小组. 本文介绍一个将911袭击及后续影响相关新闻文章 ...
- 都是大人物,看看你认识几个。
突然找到一张老图,但是一直没能认识全部的人,下面名单是填的,不一定都正确. (想要原图留下邮件,我偶尔上来,如果看到会发给你的) =================================== ...
- 机器视觉【基础】什么是机器视觉?
前言:本文尝试由繁到简论述机器视觉的定义和发展历程: 1 什么是机器视觉 What is Computer Vision? Computer Vision has a dual goal. From ...
- 互联网历史上50个最重要的时刻
从世界上第一个直播流,到宽松的美洲驼,再到没人同意的连衣裙颜色,这是自互联网诞生以来最令人难忘的时刻. 1ARPANET开启(1966) 我们不能谈论互联网历史上的重要时刻,而不要谈论成立于1966年 ...
- 北京大学可视化发展前沿研究生暑期学校Day4
第四天暑期班上午曹老师讲的可视分析中的异常监测,下午做了以下VAST的挑战并参观了实验室 总结人:tc 时间: 2017-7-12 1.可视分析中的异常监测(Interactive Visual An ...
最新文章
- MySQL 5.6.5之前版本不支持多条DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT TIMESTAMP
- XSS:RPO(Relative Path Overwrite)攻击
- python整数因子_Python:通过非整数因子下采样2D numpy数组
- php如何检测键盘按键,js键盘事件,判断按下的是哪个键
- sql2008中打开“外围应用配置器”和启用 OpenRowSet 和 OpenDataSource函数
- 有软件开发,就要有软件测试!
- 2014第3周六升级win8.1
- Android传感器编程入门(三)
- 好心情“沉浸式VR静心疗愈—荷塘月色”第二期企业沙龙活动圆满收官
- 自控原理学习笔记-系统稳定性分析(1)-BIBO稳定及Routh判据
- Python绘制一箭穿双心 动画代码
- becon帧 wifi_beacon帧
- java基于安卓Android微信小程序的音乐论坛uniAPP小程序
- Android---MVC/MVP/MVVM的演进
- 英语语法浅入-learning
- 网易免费企业邮箱Foxmail设置方法
- Litjson与JsonUtility读取json文件
- BAT和IBM信息无障碍现状概要
- APP内如何打开某个应用的App Store下载页面
- 宝宝眼皮又长“痘”了!麦粒肿和霰粒肿怎么区分?