http://acm.hdu.edu.cn/showproblem.php?pid=1085
唯一的坑点是 所有的数如果都可以求得的话 那么得不到的将是 sum+1 // 注意细节
#include<bits/stdc++.h> using namespace std; const int maxn = 5000*3; int dp[maxn]; int s[10]; void init() { memset(dp,0,sizeof(dp)); } int main () { int a,b,c; while (~scanf("%d %d %d",&s[1],&s[2],&s[5])) { init(); int sum =0; if(s[1]+s[2]+s[3] ==0 ) break; init(); for(int i=1;i<=5;i++) { sum += i*s[i]; } dp[0] =1; for(int i=1;i<=5;i++) { if(s[i]==0) continue; int k=1,t=s[i]; while (k < t) { for(int j=sum;j>=i*k;j--) { dp[j] += dp[j-i*k]; } t-=k,k*=2; } for(int j=sum;j>=i*t;j--) dp[j] += dp[j-i*t]; } int ans = sum+1; for(int i=0;i<=sum;i++) if(dp[i]==0) { ans = i; break; } printf("%d ",ans); } }