您的位置:首页 > 其它

USACO 4.1 Beef McNuggets

2013-04-24 07:27 381 查看
普通背包,注意两种特殊情况,并且判断的边界不用很大;

特殊情况:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  USACO 背包问题