背包型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导刊)的更多相关文章

  1. 洛谷P1776 宝物筛选_NOI导刊2010提高(02)

    P1776 宝物筛选_NOI导刊2010提高(02) 题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了, ...

  2. 洛谷P1776 宝物筛选_NOI导刊2010提高(02)(多重背包,单调队列)

    为了学习单调队列优化DP奔向了此题... 基础的多重背包就不展开了.设\(f_{i,j}\)为选前\(i\)个物品,重量不超过\(j\)的最大价值,\(w\)为重量,\(v\)为价值(蒟蒻有强迫症,特 ...

  3. P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化

    多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...

  4. 洛谷P1808 单词分类_NOI导刊2011提高(01) 字符串排序

    洛谷P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且 ...

  5. P1776 宝物筛选_NOI导刊2010提高(02)(背包的二进制优化)

    题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...

  6. 洛谷P1809 过河问题_NOI导刊2011提高(01)

    To 洛谷.1809 过河问题 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时 ...

  7. P1776 宝物筛选_NOI导刊2010提高(02)

    题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...

  8. Luogu P1776 宝物筛选_NOI导刊2010提高(02)(多重背包模版)

    传送门 多重背包板子题, 多重背包就是每种东西有好几个,可以把它拆分成一个一个的01背包 优化:二进制拆分(拆成1+2+4+8+16+...) 比如18=1+2+4+8+3,可以证明18以内的任何数都 ...

  9. luogu P1776 宝物筛选_NOI导刊2010提高(02)

    Sto flashhu orz flash太强啦 多重背包裸题(逃 使用压维大法,\(f_i\)为总重量为\(i\)时的答案 对于每种物品,记\(w\)为单个的重量,\(v\)为单个的价值,\(m\) ...

随机推荐

  1. BZOJ3786: 星系探索 Splay+DFS序

    题目大意:给你一个树,支持三种操作,子树加,点到根的路径和,改变某一个点的父亲. 分析: 看起来像一个大LCT,但是很显然,LCT做子树加我不太会啊... 那么,考虑更换一个点的父亲这个操作很有意思, ...

  2. plsql命令行窗口执行脚本打印输出

    1.我们可以写一些简单的检查数据库的检查脚本 prompt Importing table t_test0... set feedback off set define off ; ; prompt ...

  3. 20155202张旭 Exp4 恶意代码分析

    20155202张旭 Exp4 恶意代码分析 实验前问题回答: 一:如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来 ...

  4. 2017-2018-2 20155310『网络对抗技术』Exp5:MSF基础应用

    2017-2018-2 20155310『网络对抗技术』Exp5:MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:由攻击者或渗透测试者利 ...

  5. POJ1807&&1276

    DP专题下的背包专题 其实就是PJ的那些东西了 主流的背包有三种:01背包,完全背包和多重背包 其中01背包和完全背包的转移就比较经典了,而多重背包也是在前两者基础上演变一下即可 1837 题意:有一 ...

  6. flask登录注册简单的例子

    1.主程序 # app.py # Auther: hhh5460 # Time: 2018/10/05 # Address: DongGuan YueHua from functools import ...

  7. 解决 配置springmvc拦截所有请求后请求静态资源404的问题

    <servlet-mapping> <servlet-name>spring-servlet</servlet-name> <url-pattern>/ ...

  8. linux中wget的使用方法介绍

    wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能和特点:(1)支持断点下传功能:这一点,也是网络蚂蚁和Fl ...

  9. flask之jinjia2模板(二)

    1.1.模板传参 (1)主程序 from flask import Flask,render_template app = Flask(__name__) @app.route('/') def he ...

  10. 用Visual Studio2017写C++静态库

    造轮子是一件有趣的事情,VS是一个强大的工具,能胜任超大规模的工程,但是讲真,对不那么大的项目配置起来不是那么友好(网上的其他教程也一点都不友好Orz).这里就展示一下构建一个简单的静态库的正确姿势. ...