普通背包,注意两种特殊情况,并且判断的边界不用很大;
特殊情况:
1、有1,全都可以实现,输出0;
2、有无数情况不可实现,输出0;
关于情况2:
可以算所有的数的最大公约数。如果不是1,也就是说这些数不互质,那么不被这个最大公约数整除的数一定构造不出来。
关于边界:
最初写的时候只知道不用很大,用的100000,过了;
看过题解以后才知道判断 256^2 就可以了;
/*
ID : lancelo2
PROG : nuggets
LANG : C++
*/
#include <fstream>
#define MAXN 65536
using namespace std;
bool vis[MAXN+1];
int numbers[11];
int gcd(int v1, int v2)
{
while(v2){
int temp = v2;
v2 = v1 % v2;
v1 = temp;
}
return v1;
}
int main()
{
ifstream fin("nuggets.in");
ofstream fout("nuggets.out");
int N;
fin >> N;
for(int i = 1; i <= N; i++)
fin >> numbers[i];
int answer = 0;
vis[0] = 1;
if(N == 1){
fout << "0" << endl;
return 0;
}
int gcdnumber = numbers[1];
for(int i = 2; i <= N; i++)
gcdnumber = gcd(gcdnumber, numbers[i]);
if(gcdnumber != 1){
fout << "0" << endl;
return 0;
}
for(int i = 0; i <= MAXN; i++){
if(!vis[i]){
answer = i;
continue;
}
for(int j = 1; j <= N; j++){
vis[i+numbers[j]] = true;
}
}
fout << answer << endl;
return 0;
}