【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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值