1.没有得不到的数,最小的盒子为1
2.得不到的数无穷大,所有数的最大公约数大于1,因为得到的数只能为该公约数的倍数
3.如果存在的话,结果不会超过最大的两个数的最小公倍数
证明见:点击打开链接
4.多重背包
/*
ID: daijinq1
PROB:nuggets
LANG: C++
*/
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cstring>
#include <cstdio>
using namespace std;
#define FOR(i,a,b) for(i = (a); i < (b); ++i)
#define FORE(i,a,b) for(i = (a); i <= (b); ++i)
#define FORD(i,a,b) for(i = (a); i > (b); --i)
#define FORDE(i,a,b) for(i = (a); i >= (b); --i)
#define CLR(a,b) memset(a,b,sizeof(a))
const int MAXN = 250000;
const int INF = 0x7f7f7f7f;
bool vis[200000];
int N, T, M;
int num[MAXN];
int gcd(int a, int b){ return (b == 0) ? a : gcd(b, a % b); }
void solve() {
int i, j;
int a = num[1];
FORE(i, 1, N) {
a = gcd(a, num[i]);
}
if(a != 1 || N == 1) {
cout<<"0"<<endl;
return ;
}
vis[0] = true;
FORE(j, 1, num[1] * num[2])
FORE(i, 1, N)
if(j >= num[i] && vis[j - num[i]]) {
vis[j] = true;
break;
}
FORDE(i, num[1] * num[2], 1) {
if(!vis[i])
break;
}
cout<<i<<endl;
}
void input() {
int i;
cin>>N;
FORE(i, 1, N)
cin>>num[i];
sort(num, num + N + 1);
}
int main() {
freopen("nuggets.in", "r", stdin);
freopen("nuggets.out", "w", stdout);
input();
solve();
return 0;
}