题目链接:

https://www.luogu.org/problemnew/show/P1776

题目:

终于,破解了千年的难题。小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎。但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物。看来小FF只能含泪舍弃其中的一部分宝物了……小FF对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF有一个最大载重为W的采集车,洞穴里总共有n种宝物,每种宝物的价值为v[i],重量为w[i],每种宝物有c[i]件。小FF希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。

题解:

很容易写出状态转移方程$dp_{i,j}=max[dp_{i-1,j-w*k}+v*k],k<=c$

我们要转化为可以单调队列优化的类型

$dp_{i,j}=max[dp_{i-1,d+w*k}-v*k]+v*s,s=\lfloor \frac{j}{w} \rfloor,d=j \mod w$ 枚举k。

众所周知,dp优化的原理就是减少不必要的转移,上述这个状态转移方程就是基于发现最初始的状态转移方程里的j只能从j在模w意义下的同余系转移而得到。因而我们枚举余数d

那么如何用单调队列维护就很显然了,对于每一个余数d维护一个单调队列即可

代码

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std; const int N=4e4+;
int n,W,ans,tmp;
int dp[N],q1[N],q2[N];
inline int read()
{
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int main()
{
n=read();W=read();
for (int i=;i<=n;i++)
{
int v=read(),w=read(),c=read();
if (w==)
{
ans+=v*c;
continue;
}
c=min(c,W/w);
for (int d=;d<w;d++)//枚举余数
{
int K=(W-d)/w;//最大的整除数
int head=,tail=;
for (int k=;k<=K;k++)//枚举整除数
{
int now=dp[d+w*k]-v*k;
while (head<=tail&&now>=q1[tail]) --tail;
++tail;
q1[tail]=now;
q2[tail]=k;
while (head<=tail&&c<k-q2[head]) head++;
dp[d+w*k]=max(dp[d+w*k],q1[head]+v*k);
tmp=max(dp[d+w*k],tmp);
}
}
}
printf("%d\n",tmp+ans);
return ;
}

最新文章

  1. zigbee 路由节点丢失后清除 该节点的残余网络信息
  2. C#以管理员身份运行程序
  3. [转] Redis系统性介绍
  4. chrome浏览器关闭标签页面
  5. poj1026 Cipher
  6. 全国行政区划代码(json对象版)
  7. Python mix-in 组合 ~ 将类组合起来 .
  8. 【转】OS X Mavericks: 防止 Mac 进入睡眠 -- 不错
  9. python ATM购物程序
  10. SQL数据库的应用一(Day 24)
  11. 1342: [Baltic2007]Sound静音问题
  12. 【方法】Html5实现文件异步上传
  13. 201521123003《Java程序设计》第9周学习总结
  14. Android 开发笔记___基本适配器的使用__BaseAdapter
  15. jsDOM编程-拖拽层
  16. 解决将龙邱oled库移植到野火工程里,oled汉字无法显示问题
  17. 通过Beego将之前实现的短url项目实现
  18. 聊聊数据库~4.SQL优化篇
  19. Java 中的字符串转为二进制
  20. RabbitMQ集群简介

热门文章

  1. Swift - 使用CollectionView实现图片Gallery画廊效果(左右滑动浏览图片)
  2. spark Bisecting k-means(二分K均值算法)
  3. OEM:Enterprise Manager 无法连接到数据库实例 错误解决
  4. IPython Autoreload
  5. 实现两个jQuery的API(addClass、text)
  6. The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online J Press the Button
  7. LeetCode(96)Unique Binary Search Trees
  8. C语言-实现整数倒序输出
  9. IPv6地址分配
  10. CF859C Pie Rules 动态规划 逆推_思维题