jzoj P1252 天平

78 篇文章 0 订阅
30 篇文章 0 订阅

题目大意:
用N个已知质量的砝码去称牛,牛的一边不能放砝码,且天平能承受的物体的质量不是无限的,当天平某一边物体的质量大于C时,天平就会被损坏。砝码按照它们质量的大小被排成一行,这一行中从第3个砝码开始,每个砝码的质量至少等于前面两个砝码(也就是质量比它小的砝码中质量最大的两个)的质量的和。FJ想知道用这些砝码在天平上能称出的质量最大是多少。由于天平的最大承重能力为C,他不能把所有砝码都放到天平上。

1<=N<=40
1<=C<2^30
所有砝码质量的数值都在31位二进制内

题解:
搜索+前缀和优化:
这题不难发现,因为是递增的,所以从后面打一个搜索就可以了。
如何用前缀和去优化?
首先我们对砝码做一个前缀和;
然后我们当前搜到的解为ans,当前为第i个,那么我们要保证ans+sum[i]>我们已知的最优解max,否则exit。

var
    a:array [0..41] of longint;
    f:array [0..41] of int64;
    max,i,j,n,m:longint;

procedure dfs(dep,ans:longint);
begin
   if ans+f[dep]<=max then exit;
   if ans>max then max:=ans;
   if dep<1 then exit;
   if ans+a[dep]<=m
      then dfs(dep-1,ans+a[dep]);
   dfs(dep-1,ans);
   if a[dep]<=m
      then dfs(dep-1,a[dep]);
end;

begin
    readln(n,m);
    for i:=1 to n do
    begin
         readln(a[i]);
         f[i]:=f[i-1]+a[i];
    end;
    dfs(n,0);
    writeln(max);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值