题目链接: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; }