您的位置:首页 > 其它

Holding Bin-Laden Captive! hdoj 1085 (母函数初学,其他简便方法)

2016-04-26 20:31 411 查看

Holding Bin-Laden Captive! hdoj 1085 (母函数初学,其他简便方法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1085

题目大意:给你1,2,5元的硬币数量,求没办法组成的最小数。

非母函数求解,可见如果可以分成三种情况:1.没有1元的就最小为1;

2.如果1,2没办法组成1-4所有的数,那轮不到用5就结束了,此时最小为a+b*2+1;

3.另外可以组成1-4则,在最大数a+b*2+c*5的数均可得到。

ac代码

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a,b,c;
while(cin >> a >> b >> c)
{
if(a==0 && b==0 && c==0)
break;
if(a == 0)
printf("1\n");
else if(a+b*2 < 4)
printf("%d\n",a+b*2+1);
else
printf("%d\n",a+b*2+c*5+1);
}
return 0;
}


用母函数的话,既然是初学,我们先了解下母函数

可以看下我转载的一篇关于母函数的文章。

http://blog.csdn.net/qq_33199236/article/details/51253524

关于这一题的话:其母函数应该为(1+x^1+x^2+….x^a) * (1+x^2+x^4+….x^(2b)) * (1+x^5+x^10+…+x^(5c));

ac代码

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int c1[10000],c2[10000];
int main()
{
int a,b,c;
while(cin >> a >> b >> c)
{
if(a==0 && b==0 && c==0)
break;
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
for(int i=0;i<=a;i++)
c1[i] = 1;
// 模拟前两个式子
for(int i=0;i<=a;i++)
for(int j=0;j<=2*b;j+=2)
c2[i+j]+=c1[i];
for(int i=0;i<=a+2*b;i++)
c1[i]=c2[i];
memset(c2,0,sizeof(c2));
for(int i=0;i<=a+2*b;i++)
for(int j=0;j<=5*c;j+=5)
c2[i+j]+=c1[i];
int i;
for(i=0;i<=a+2*b+5*c;i++)
{
if(c2[i] == 0)
break;
}
printf("%d\n",i);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: