POJ2392

题意:奶牛们要用K个不同类型的石头建太空电梯.每一种石头的高度为Hi,数量为Ci,且不能放在高于Ai的地方,求最高能建多高的太空电梯.

分析:多重背包,数组标记.显然将ai小的放在下面会更优.所以先排序.

code:

const maxh=41000;
var   cnt:array[0..maxh] of longint;
      h,a,c:array[0..401] of longint;
      f:array[0..maxh] of boolean;
      n,i,j,k,tmp,ans:longint;

      procedure swap(var a,b:longint);
      var   tmp:longint;
      begin
            tmp:=a; a:=b; b:=tmp;
      end;

      procedure sort(l,r:longint);
      var   i,j,mid:longint;
      begin
            i:=l; j:=r;
            mid:=a[(l+r)>>1];
            while i<=j do
            begin
                  while a[i]<mid do inc(i);
                  while a[j]>mid do dec(j);
                  if i<=j then
                  begin
                        swap(h[i],h[j]);
                        swap(a[i],a[j]);
                        swap(c[i],c[j]);
                        inc(i); dec(j);
                  end;
            end;
            if i<r then sort(i,r);
            if j>l then sort(l,j);
      end;

begin

      readln(n);
      for i:=1 to n do readln(h[i],a[i],c[i]);
      sort(1,n);

      f[0]:=true;
      for i:=1 to n do
      begin
            fillchar(cnt,sizeof(cnt),0);
            for j:=0 to a[i] do
            if (f[j]=true)and(not f[j+h[i]])and(j+h[i]<=a[i])and(cnt[j]<c[i]) then
            begin
                  f[j+h[i]]:=true;
                  cnt[j+h[i]]:=cnt[j]+1;
            end;
      end;

      for i:=maxh downto 0 do if f[i] then break;
      writeln(i);

end.

转载于:https://www.cnblogs.com/exponent/archive/2011/08/12/2136501.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值