/*njoj 1251 zlly長了一張包子臉 題意: zlly長了一張包子臉。他特別喜歡吃糖果,現在他手頭有若干種糖果,每種糖果有個口味值。每種糖果有無數多個。而後婁童鞋也很喜歡吃糖果,他的口味特別普遍。他喜歡各類各樣的口味值,他要求zlly用現有的口味值拼出新的口味值。現在,婁童鞋想知道他不能吃到的口味值最大是多少?你能幫他的忙嗎? 舉個樣例。現在zlly手頭有3,6,10三種糖果,他拼不出口味值爲一、二、四、五、7…17的糖果。因此結果就是17。 另外。糖果種類數<=10,每種糖果的口味值<=265,可以保證最大的結果不超過2,000,000,000。假設都可以拼出或最大值不存在。輸出0。 思路: 事實上2*1e9是虛的。 gcd(a1,...,an)!=1時,無解, gcd(a1,...,an)==1時,有解,解的上界爲max(ai*aj),不會證, 因此暴力就能夠。 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=15; const int MAX_N=1000005; int a[N]; bool arr[MAX_N]; void gao(int n){ memset(arr,0,sizeof(arr)); int gcd=a[0]; for(int i=1;i<n;++i){ gcd=__gcd(gcd,a[i]); } if(gcd!=1){ puts("0"); return ; } int _min=300; for(int i=0;i<n;++i) _min=min(a[i],_min); int cnt=0; int ans; arr[0]=1; for(int i=1;i<MAX_N;++i){ for(int j=0;j<n;++j){ if(a[j]>i) continue; if(arr[i-a[j]]){ arr[i]=1; break; } } if(arr[i]) ++cnt; else cnt=0; if(cnt==_min){ ans=i-_min; break; } } printf("%d\n",ans); } int main(){ int n; while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;++i){ scanf("%d",&a[i]); } gao(n); } return 0; }