hdu1085Holding Bin-Laden Captive!组合问题
来源:互联网 发布:淘宝运费险怎么设置 编辑:程序博客网 时间:2024/05/22 03:43
题目连接
题目意思:有单位价值为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 }
- hdu1085Holding Bin-Laden Captive!组合问题
- hdu1085Holding Bin-Laden Captive!
- hdu1085Holding Bin-Laden Captive!-简单题
- hdu1085Holding Bin-Laden Captive!(母函数)
- HDU_1085_Holding Bin-Laden Captive!
- Holding Bin-Laden Captive!
- Holding Bin-Laden Captive!
- Holding Bin-Laden Captive!
- Holding Bin-Laden Captive!
- Holding Bin-Laden Captive!
- Holding Bin-Laden Captive!
- Holding Bin-Laden Captive!
- Holding Bin-Laden Captive!
- hdu1085_Holding Bin-Laden Captive!
- HDU - 1085 Holding Bin-Laden Captive!(硬币问题)
- 1085 Holding Bin-Laden Captive!
- HDOJ Holding Bin-Laden Captive!
- hdu1085-Holding Bin-Laden Captive!
- 远程连接Linux的相关配置
- 作者: 果冻虾仁 来源: CSDN 发布时间: 2017-08-10 23:08 阅读: 52608 次 推荐: 251
- masonry报'attempting to add unsupported attribute: (null)'
- 类似angularjs的ng-options解析规则的解析函数
- 为什么说 Objective-C 是一种动态语言?
- hdu1085Holding Bin-Laden Captive!组合问题
- Python35调用谷歌翻译
- 2017 ACM Arabella Collegiate Programming Contest F. Monkeying Around GYM101350F
- 第五周项目一——j建立顺序栈算法库
- 用命令行工具sqlite3打开数据库出现乱码的解决方案
- 导入excel 到sqlserver数据库 外部数据库驱动程序中(1)的意外错误 [问题点数:40分]
- C#使用MongoDB的注意事项
- jQuery-- ajax方法
- C++音频单声道、双声道之间的转换