usaco Beef McNuggets

来源:互联网 发布:有限元分析用哪个软件 编辑:程序博客网 时间:2024/05/04 21:39

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;}