JZOJ1297.【USACO题库】4.1.1 Beef McNuggets麦香牛块

题目描述

农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块。奶牛们正在想尽一切办法让这种可怕的设想泡汤。奶牛们进行斗争的策略之一是“劣质的包装”。“看,”,奶牛们说,“如果你用只有一次能装3块、6块或10块的三种包装盒装麦香牛块,你就不可能满足想要一次只想买1、2、4、5、7、8、11、14或17块麦香牛块的顾客了。劣质的包装意味着劣质的产品。”

你的任务是帮助这些奶牛。给出包装盒的种类数N(1<=N<=10)和N个代表不同种类包装盒容纳麦香牛块个数的正整数(1<=i<=256),输出顾客不能用上述包装盒(每种盒子数量无限)买到麦香牛块的最大块数。如果在限定范围内所有购买方案都能得到满足,则输出0。

范围限制是所有不超过2,000,000,000的正整数。

PROGRAM NAME: nuggets

INPUT FORMAT

第1行: 包装盒的种类数N
第2行到N+1行: 每个种类包装盒容纳麦香牛块的个数

SAMPLE INPUT (file nuggets.in)

3

3

6

10

OUTPUT FORMAT

输出文件只有一行数字:顾客不能用包装盒买到麦香牛块的最大块数或0(如果在限定范围内所有购买方案都能得到满足)。

SAMPLE OUTPUT (file nuggets.out)

17

输入

输出

样例输入

样例输出

数据范围限制

前注:
自己一个人做的,没看博客(半年前看了越看越懵,今晚突然茅厕顿开怒码AC)

思路:
一点点基础数论,和近似背包DP
………………
首先一点要知道的数论知识是两个数p,q,且gcd(p,q)=1
那么最大无法表示成px+qy(x>=0,y>=0)的数是pq-p-q
有什么用?
因为最大的包装不超过256,所以这道题的空间只需开到256²+256

还有一个对于无穷解的情况:
1.输入中有1,这个很显然
2.一个大于256^2的数不能被包装合成,且小于等于256^2+256

接下来,只需普通的无穷背包DP

            if (bz[i])and(i+a[j]<=maxn) then
                    bz[i+a[j]]:=true;

……不要在评论区告诉我说看不懂……

代码:

const
        maxn=65792;//256²+256
var
        bz:array[0..maxn]of boolean;
        a:array[0..10]of longint;
        n,i,j:longint;
begin
        readln(n);
        for i:=1 to n do
        begin
                readln(a[i]);
                if a[i]=1 then
                begin
                        writeln(0);
                        halt;
                end;
                bz[a[i]]:=true;
        end;
        for j:=1 to n do
        begin
                for i:=0 to maxn do
                if (bz[i])and(i+a[j]<=maxn) then
                        bz[i+a[j]]:=true;//类似无穷背包DP,从可行的方案推来
        end;
        for i:=maxn downto 0 do
        if not bz[i] then
        begin
                if (i>sqr(256))and(i<=maxn)then
                        writeln(0)
                else writeln(i);
                break;
        end;
end.

后注:
感觉……是USACO第四部分里面最水的题了吧……背包问题……

你可能感兴趣的:(usaco,DP)