题意:大概就是马拉登躲到了杭州的一个山洞里不敢出来。他最近几年遇到了一个问题没有解决出来,他说,如果谁能解出这个问题他就自杀。哈哈哈。。。我居然信了。
这个问题的关键就是分别给出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-8
using 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;
}