背包问题的优化(洛谷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\) ...
随机推荐
- 一文让您全面了解清楚HBase数据库的所有知识点,值得收藏!
一.HBase基本概念:列式数据库 在Hadoop生态体系结构中,HBase位于HDFS(Hadoop分布式文件系统)的上一层,不依赖于MapReduce,那么如果没有HBase这种Nosql数据库会 ...
- RESTful API设计概要
一.简介 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fiel ...
- 20155210 EXP6 信息搜集与漏洞扫描
20155210 EXP6 信息搜集与漏洞扫描 信息搜集 外围信息搜集 通过DNS和IP挖掘目标网站的信息 whois 域名注册信息查询 我们通过输入whois qq.com可查询到3R注册信息,包括 ...
- python 回溯法 子集树模板 系列 —— 5、取物搭配问题
问题 有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子.一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配? 分析 换个角度看,现有头.身.腿三个元素,每个元素都有各自的几种状态. ...
- 【Qt】QOpenGLWidget展示蒙版效果
关键代码是派生QOpenGLWidget,覆写paintEvent函数 QPainter p; p.begin(this); p.drawImage(QPoint(, ), m_Img); QLine ...
- 解决 配置springmvc拦截所有请求后请求静态资源404的问题
<servlet-mapping> <servlet-name>spring-servlet</servlet-name> <url-pattern>/ ...
- R语言学习 第二篇:矩阵和数组
向量是一维的,只有行这一个维度,没有其他维度.R可以创建更高维度的数据对象,例如,矩阵.数据框.数组,索引高维度的对象时,需要使用元素的下标.这些对象的下标都使用中括号[]和索引,第一个维度是row, ...
- 【ORACLE】oracle打补丁
-- 备份旧的opatch cd $ORACLE_HOME/ mv OPatch OPatch_20180323_old -- 上传补丁工具和补丁包到oraclehome目录下,解压 unzip p ...
- effective c++ 笔记 (49-52)
//---------------------------15/04/27---------------------------- //#49 了解new-handler的行为 { /* 1:在o ...
- HTML 表格实例
1.表格这个例子演示如何在 HTML 文档中创建表格. <p>每个表格由 table 标签开始.</p><p>每个表格行由 tr 标签开始.</p>&l ...