HDU_1085
这个题目可以用完全背包问题的思路去解,为了练一下生成函数,我就用生成函数的思路写了一下,构造生成函数G(x)=(1+x+x^2+…+x^n1)(1+x^2+x^4+…+x^(2*n2))(1+x^5+x^25+…+x^(5*n3)),最后按x,x^2…的顺序看哪一项的系数为0即可。
#include<stdio.h>
#include<string.h>
#define MAXD 5
#define MAXM 8000
int f[MAXD][MAXM], elem[] = {0, 1, 2, 5}, num[MAXD], S;
int init()
{
int i;
S = 0;
for(i = 1; i <= 3; i ++)
{
scanf("%d", &num[i]);
S += elem[i] * num[i];
}
return S;
}
void solve()
{
int i, j, k;
for(i = 0; i <= 3; i ++)
for(j = 0; j <= S + 1; j ++)
f[i][j] = 0;
f[0][0] = 1;
for(i = 1; i <= 3; i ++)
for(j = 0; j <= num[i]; j ++)
for(k = 0; k + j * elem[i] <= S; k ++)
f[i][k + j * elem[i]] |= f[i - 1][k];
for(i = 1; f[3][i]; i ++);
printf("%d\n", i);
}
int main()
{
while(init())
{
solve();
}
return 0;
}