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

题目大意:

给n个数,判断一个最大的数不能被这n个数组合。组合的时候可以选无数个。

样例输入:

3

3 6 10

样例输出:

17


解释:

1,2,4,5,7,8,11,14,17——都不能,其中17最大。

这道题目主要是如何判断当前这个数是最大,不用循环下去,以后的都可以被组合到了,这就需要判断如果当前连续可以组合的已经等于min{a[i]}了——例如就可以break了,因为这样子就可以永远的组合下去了。

还有就是有一个特殊数据,特殊判断一下,如果循环次数大于1000000的话直接输出0

var
        flag:boolean;
        n,i,min,ans,t,max:longint;
        a:array[1..10] of longint;
        f:array[0..1000000] of boolean;
begin
        readln(n);
        min:=maxlongint;
        for i:=1 to n do
        begin
                read(a[i]);
                f[a[i]]:=true;
                if a[i]<min then min:=a[i];
        end;

        t:=1;
        f[0]:=true;
        while true do
        begin
                flag:=false;
                for i:=1 to n do
                        if (t>=a[i]) and f[t-a[i]] then
                        begin
                                flag:=true;
                                break;
                        end;
                if flag then
                begin
                        f[t]:=true;
                        inc(ans);
                        if ans=min then break;
                end
                else
                begin
                        ans:=0;
                        if t>max then max:=t;
                end;
                inc(t);
                if t>1000000 then
                begin
                        writeln(0);
                        halt;
                end;
        end;

        writeln(max);
end.

你可能感兴趣的:(【USACO题库】4.1.1 Beef McNuggets麦香牛块)