背包问题的优化(洛谷1776 宝物筛选_NOI导刊)
背包型dp,但是没有看清数据范围差点认为是水题了,(然后诡异的拿了20分)
标解是:2进制优化,比较简单把每一类物品看做若干个相互独立的物品,放在一个另外的数组里,然后全局跑一边01就可以。
主要思想是:将一种物品分成1、2、3..一份,然后跑01(01的复杂度低啊!)
如果难以理解的话不妨举个例子:如2=1+1;5=1+2+2;4=1+2+1;
就是说依次递增,当最后一次的次数太大了使前面所有的和加起来大于次数了那么我们就不继续递增拉
好理解的程序的话就是这样的但是跑的慢(最后一个点500多ms!)
uses math;
var n,v,i,j,tc,tw,tt,cnt,pp:longint;
w,c:array[..]of longint;
f:array[..]of longint;
begin
readln(n,v);
cnt:=;
for i:= to n do begin
readln(tc,tw,tt);//读入一种物品的价值、代价、次数
pp:=;//分解的第一种是1个分解
while true do begin//死循环拉~~
c[cnt]:=pp*tc;//加1个物品的物品
w[cnt]:=pp*tw;
inc(cnt);
dec(tt,pp);//减去次数
inc(pp);//下一种次数
if tt-pp< then break;//不够了。。。
end;
if tt> then begin//如果还有剩余次数那么重新来一个把!
c[cnt]:=tt*tc;
w[cnt]:=tt*tw;
inc(cnt);
end;
end;
for i:= to cnt do//跑一组01就完事了;
for j:=v downto w[i] do
f[j]:=max(f[j],f[j-w[i]]+c[i]);
writeln(f[v]);
end.//收工!
(虽然上面是AC程序但是时间效率太低最后一点500ms,其实上面我们是分解123,但是现在可以按照二进制来做124)
其实这道题的本质是二进制的算法,我们考虑把这个物品换成若干件物品,使得原问题中不论这种物品取多少件(0到最大件数p之间),都能等价于取若干件代换以后的物品。且超过x件的策略必定不能出现。就是说,将每个物品分成若干件01背包中的物品,其中每件物品有一个系数。这件物品的费用和价值均是原来的费用和价值乘以这个系数。(假设有一种价值为v,重量为w,限购次数为x的物品)令这些系数分别为1,2,2^2,…,2^(k-1),x+1-2^k,且k是满足x+1-2^k>0的最大整数。由于加了位运算,解题的能力快速提高,时间比较快(虽然上面是可以AC但是下面更加优秀)
uses math;
var n,v,i,j,aa,cc,bb,cnt:longint;
w,c:array[..]of longint;
f:array[..]of longint;
begin
readln(n,V);//读入物品和背包体积
cnt:=;//分裂后待选的物品总数
for i:= to n do begin
readln(aa,bb,cc);//每一件物品的价值、体积、次数
j:=;
while j<=cc do begin//分成若干个物品
w[cnt]:=j*bb;//第cnt件物品的体积=体积*次数
c[cnt]:=j*aa;//第cnt件物品的价值=价值*次数
cc:=cc-j;//次数分解
j:=j<<;//j乘以2
inc(cnt);
end;
if cc> then begin//如果次数还有多余那么一次性加
w[cnt]:=cc*bb;
c[cnt]:=cc*aa;
inc(cnt);
end;
end;
for i:= to cnt do
for j:=v downto w[i] do
f[j]:=max(f[j],f[j-w[i]]+c[i]);
writeln(f[V]);
end.
背包问题的优化(洛谷1776 宝物筛选_NOI导刊)的更多相关文章
- 洛谷P1776 宝物筛选_NOI导刊2010提高(02)
P1776 宝物筛选_NOI导刊2010提高(02) 题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了, ...
- 洛谷P1776 宝物筛选_NOI导刊2010提高(02)(多重背包,单调队列)
为了学习单调队列优化DP奔向了此题... 基础的多重背包就不展开了.设\(f_{i,j}\)为选前\(i\)个物品,重量不超过\(j\)的最大价值,\(w\)为重量,\(v\)为价值(蒟蒻有强迫症,特 ...
- P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化
多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...
- 洛谷P1808 单词分类_NOI导刊2011提高(01) 字符串排序
洛谷P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且 ...
- P1776 宝物筛选_NOI导刊2010提高(02)(背包的二进制优化)
题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...
- 洛谷P1809 过河问题_NOI导刊2011提高(01)
To 洛谷.1809 过河问题 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时 ...
- P1776 宝物筛选_NOI导刊2010提高(02)
题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...
- Luogu P1776 宝物筛选_NOI导刊2010提高(02)(多重背包模版)
传送门 多重背包板子题, 多重背包就是每种东西有好几个,可以把它拆分成一个一个的01背包 优化:二进制拆分(拆成1+2+4+8+16+...) 比如18=1+2+4+8+3,可以证明18以内的任何数都 ...
- luogu P1776 宝物筛选_NOI导刊2010提高(02)
Sto flashhu orz flash太强啦 多重背包裸题(逃 使用压维大法,\(f_i\)为总重量为\(i\)时的答案 对于每种物品,记\(w\)为单个的重量,\(v\)为单个的价值,\(m\) ...
随机推荐
- 利尔达推出工控解决方式 串口转以太网模块LSD1ES-W5500_S2E0
利尔达最近推出工控解决方式,串口转以太网模块LSD1ES-W5500_S2E0,模块基于WIZnet-W5500. 同一时候,这也是利尔达科技集团成为WIZnet代理商后,自行推出的第一款基于WIZn ...
- 20155333 《网络对抗》Exp4 恶意代码分析
20155333 <网络对抗>Exp4 恶意代码分析 基础问题回答 1.如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪 ...
- ES6 箭头函数易出错细节
箭头函数表达式的语法比函数表达式更短,并且没有自己的this,arguments,super或 new.target. 箭头函数基本语法 (参数1, 参数2, -, 参数N) => { 函数声明 ...
- 基于HTTPS的中间人攻击-BaseProxy
前言 在上一篇文章BaseProxy:异步http/https代理中,我介绍了自己的开源项目BaseProxy,这个项目的初衷其实是为了渗透测试,抓包改包.在知识星球中,有很多朋友问我这个项目的原理及 ...
- markdown 笔记二
Markdown 语法笔记==============================1,头部欢迎# 欢迎使用flaskBlog ------ flask对于我来说,适合快速开发一些小网页,自己也想整 ...
- Mysql基础命令(二)select查询操作
条件查询 使用Where进行数据筛选结果为True的会出现在结果集里面 select 字段 from 表名 where 条件; # 例: select * from test_table where ...
- python代码实现经典排序算法
排序算法在程序中有至关重要的作用, 不同算法的时间复杂度和空间复杂度都有所区别, 这影响着程序运行的效率和资源占用的情况, 经常对一些算法多加练习, 强化吸收, 可以提高对算法的理解, 进而运用到实践 ...
- Unity导入模型出现 (Avatar Rig Configuration mis-match. Bone length in configuration does not match position in animation)?
昨天遇到这两个模型导入的问题,查了一下资料,自己摸索了一下解决方法..总结一下~ 出现的原因:(问题1)Warning 当模型文件导入以后并且设置Animation Type是Generic的时候,动 ...
- SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志(译)
SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志 作者:Tony Davis,2012/01/27 系列 本文是进阶系列的一部分:SQL Server中事务日志管理的步骤 当事情 ...
- 从两个设计模式到前端MVC-洪宇
引言 本文将从策略模式和观察者模式两个设计模式讲起,接着过渡到一个经典的复合模式- MVC架构,进而介绍MVC在Web上的适应-Model2架构.之后,我们将视野扩展到前端MVC,看一看前端MVC经典 ...