背包型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. 20155211 Exp4 恶意代码分析

    20155211 Exp4 恶意代码分析 实践目标 1 监控你自己系统的运行状态,看有没有可疑的程序在运行. 2 是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或 ...

  2. Eclipse中Maven插件配置

    1. Maven插件配置 http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 2. Ma ...

  3. DeepFM算法解析及Python实现

    1. DeepFM算法的提出 由于DeepFM算法有效的结合了因子分解机与神经网络在特征学习中的优点:同时提取到低阶组合特征与高阶组合特征,所以越来越被广泛使用. 在DeepFM中,FM算法负责对一阶 ...

  4. HTML5 之 FileReader 方法上传并读取文件

    原文地址:https://caochangkui.github.io/file-upload/ HTML5 的 FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据 ...

  5. CS50.1

    1,GUI,graphical user interface,图形用户界面 2.VB,visual basic,微软开发的一种程序语言 3,BIT,binary digit 比特 4,byte 5,8 ...

  6. [CF1063F]String Journey[后缀数组+线段树]

    题意 在 \(S\) 中找出 \(t\) 个子串满足 \(t_{i+1}\) 是 \(t_{i}\) 的子串,要让 \(t\) 最大. \(|S| \leq 5\times 10^5\). 分析 定义 ...

  7. windows下如何查看进程、端口占用、杀死进程教程

    一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano 可以查看所有进程 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道 ...

  8. SSISDB4:当前正在运行的Package及其Executable

    SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...

  9. stl源码剖析 详细学习笔记 hashset hashmap

    //---------------------------15/03/26---------------------------- //hash_set { /* hash_set概述: 1:这是一个 ...

  10. NodeJS旅程 : module 不可忽略的重点

    modules 模块的简介 Module 是Node.js中最重要的一个部分也是进行深度开发前的必修课.掌握Module才能真正理解NodeJS的精髓,你会发现从思路上会有极大的扩展.  学会写mod ...