题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1085
题目大意:有a个1元硬币, b个2元硬币, c个3元硬币。问最小不能组成的正整数是多少?

思路:遍历从小到大方案数为0的输出就可以了。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
//n*p*logn
struct Function{
    int n1[20005], n2[20005], v[20005];
    int a[20005], b[20005];
    int getfun(int k, int p){//物品数 组成p的方案数
        memset(a, 0, sizeof(int)*(p+1));
        a[0]=1;
        int last=0;
        for(int i=1; i<=k; i++){
            int last2=min(last+n2[i]*v[i], p);
            memset(b, 0, sizeof(int)*(last2+1));
            for(int j=n1[i]; j<=n2[i]&&j*v[i]<=last2; j++){
                for(int k=0; k<=last&&k+j*v[i]<=last2; k++){
                    b[k+j*v[i]]+=a[k];
                }
            }
            memcpy(a, b, sizeof(int)*(last2+1));
            last=last2;
        }
        return a[p];
    }
}fun;

int main() {
    int a[5];
    while(~scanf("%d%d%d", &a[1], &a[2], &a[3])){
        if(a[1]==0&&a[2]==0&a[3]==0) return 0;
        for(int i=1; i<=3; i++){
            fun.v[i]=i;
            if(i==3){
                fun.v[i]=5;
            }
            fun.n1[i]=0, fun.n2[i]=a[i];
        }
        fun.getfun(3, 8005);
        for(int i=1; i<=8005; i++){
            if(fun.a[i]==0){
                printf("%d\n", i);
                break;
            }
        }
    }

    return 0;
}