jzoj P1252 天平

xiaoxiao2021-02-28  99

题目大意: 用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.
转载请注明原文地址: https://www.6miu.com/read-61812.html

最新回复(0)