题意:给你1,2,5类型的硬币的数量;
求最小不能组成的数额。。。。。
母函数:G(x) = (1+x+x^2+...+x^a[1])(1+x^2+x^4+...+x^2*a[2])(1+x5+x10+x15...+x^5*a[3]).......
#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
//#include<map>
#include<cmath>
#include<iostream>
#include <queue>
#include <stack>
#include<algorithm>
#include<set>
using namespace std;
#define INF 1e8
#define inf -0x3f3f3f3f
#define eps 1e-8
#define LL long long
#define maxn 10
#define mol 100000007
const int _max = 10001;
// c1是保存各项质量砝码可以组合的数目
// c2是中间量,保存没一次的情况
int c1[_max], c2[_max];
int main()
{ //int n,i,j,k;
int nNum[4]={0,1,2,5},maxnum; //
int i, j, k,c;
int a[4],t;
while(scanf("%d%d%d",&a[1],&a[2],&a[3]),a[1],a[2],a[3])
{
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
maxnum=1;
for(i=1;i<4;i++)//判断所有硬币能够凑出的最大数是多少
maxnum+=a[i]*nNum[i];
for(i=0; i<=a[1]; ++i) // ---- ①
{
c1[i] = 1;
c2[i] = 0;
}
for(i=2; i<4; ++i) // ----- ②
{
for(j=0; j<=maxnum; ++j) // ----- ③
for(c=0,k=0; c<=a[i]&&k+j<=maxnum; k+=nNum[i],c++) // ---- ④
{
c2[j+k] += c1[j];
}
for(j=0; j<=maxnum; ++j) // ---- ⑤
{
c1[j] = c2[j];
c2[j] = 0;
}
}
int ans=0;
for(i=1;i<=maxnum;i++)
{
if(c1[i]==0)
break;
}
cout << i << endl;
}
return 0;
}