hdu1085 母函数的运用

来源:互联网 发布:马来西亚知乎 编辑:程序博客网 时间:2024/06/11 19:25

题意:大概就是马拉登躲到了杭州的一个山洞里不敢出来。他最近几年遇到了一个问题没有解决出来,他说,如果谁能解出这个问题他就自杀。哈哈哈。。。我居然信了。

这个问题的关键就是分别给出1,2,5三个面值的硬币个数(q,w,e),求出不能支付的最小金额是多少。明显的一个母函数的问题。

(1+q*x)*(1+w*x^2)+(1+e*x^5) 其实也就是一个背包dp问题。

#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>#include <queue>#include <map>#include <stack>#include <list>#include <vector>#include <ctime>#define LL __int64#define eps 1e-8using namespace std;int a[5],b[5],c1[10000],c2[10000],q,w,e,t,i,j,k,n;int main(){while (~scanf("%d%d%d",&q,&w,&e) && (q+w+e)){n=q+2*w+5*e;a[1]=1;a[2]=2;a[3]=5;b[1]=q;b[2]=w;b[3]=e;memset(c1,0,sizeof(c1));memset(c2,0,sizeof(c2));for (i=0;i<=q;i++){c1[i]=1;c2[i]=0;}for (i=2;i<=3;i++){for (j=0;j<=n;j++){if (c1[j])for (k=0,t=0;k+j<=n && t<=b[i];t++,k+=a[i])c2[k+j]+=c1[j];}for (j=0;j<=n;j++){c1[j]=c2[j];c2[j]=0;}}for (i=0;i<=n+1;i++)if (!c1[i]){printf("%d\n",i);break;}}return 0;}


0 0