WOJ 46 完全背包
高级的暴力,神仙优化……
首先$O(n^{3})$的$dp$很好想,然后这样可以$O(1)$地回答询问。
考虑到所有物品的体积是一个连续的区间,所以说我们可以合并一些物品来达到预处理时间均摊的效果。
我们知道$k = pm + q$表示一个带余除法,那么我们对于每一个$k$,考虑枚举物品的体积$v$然后选取一个适当的模数$m$来优化计算。
对于每一个询问$ans = max(f_{pm, i}, f_{q, v - i}) ( 0 \leq i \leq v)$
这样的话我们预处理$f_{0,1,2,...,m}$和$f_{m, 2m, 3m, ..., km} (n \leq km)$就可以回答问题了。
根据分块的思想当$m = \sqrt{n}$时,合并后的物品的数量是根号级别的,这样预处理的时间复杂度是$O(n ^ {2.5})$较优,回答每一个询问的时间是$O(n)$,可以通过本题。
还有一个小细节就是要注意当$q$取1时其实答案只能取$f_{q, v}$,但是找答案的过程中可能会出现$f_{q, i} (i < v)$比答案大的情况,所以我们将$f$先全部标记为不合法状态,然后记$f_{0, 0} = 0$为合法状态,就可以避免中间项答案的干扰。
膜Claris。
Code:
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std; const int N = ;
const int M = ;
const int inf = << ; int n, m, qn, w[N], f[M][N], g[M][N]; inline void read(int &X) {
X = ;
char ch = ;
int op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} int main() {
memset(f, , sizeof(f));
memset(g, , sizeof(g)); read(n), read(qn);
m = sqrt(n) + ;
for(int i = ; i <= n; i++) {
read(w[i]);
f[][i] = w[i];
} for(int i = ; i <= m; i++)
for(int j = ; j <= n; j++)
for(int k = ; k <= j; k++)
chkMax(f[i][j], f[i - ][k] + w[j - k]); g[][] = f[][] = ;
for(int i = ; i <= n; i++)
g[][i] = f[m][i]; for(int i = ; i <= m; i++)
for(int j = ; j <= n; j++)
for(int k = ; k <= j; k++)
chkMax(g[i][j], g[i - ][k] + f[m][j - k]); for(int k, v, a, b, ans; qn--; ) {
read(k), read(v);
ans = -inf, a = k / m, b = k % m;
for(int i = ; i <= v; i++)
chkMax(ans, f[b][i] + g[a][v - i]);
printf("%d\n", ans);
} return ;
}
WOJ 46 完全背包的更多相关文章
- woj1005-holding animals-01pack woj1006-Language of animals-BFS
title: woj1005-holding animals-01pack date: 2020-03-05 categories: acm tags: [acm,woj,pack] 01背包.中等题 ...
- Euro Efficiency_完全背包
Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...
- Euro Efficiency(完全背包)
Euro Efficiency Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) Tot ...
- hdu 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】(转)
HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包 ...
- 0-1背包 VIOJ1025
P1025小飞侠的游园方案 请 登录 后递交 标签:[显示标签] 描述 菜虫:你的题目是--我们的情报组织探听到敌人的重要将领--小飞侠星期天会邀他的灵儿妹妹到公园去玩.公园里有很多娱乐项目,可并不是 ...
- POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)
Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...
- 【转载】 HDU 动态规划46题【只提供思路与状态转移方程】
1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数) ...
- 「NOIP2006」「LuoguP1064」 金明的预算方案(分组背包
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行” ...
- HDU 6125 Free from square (状压DP+分组背包)
题目大意:让你在1~n中选择不多于k个数(n,k<=500),保证它们的乘积不能被平方数整除.求选择的方案数 因为质数的平方在500以内的只有8个,所以我们考虑状压 先找出在n以内所有平方数小于 ...
随机推荐
- sass入门篇
CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行编码工作. 通俗的说,“CSS ...
- brew安装php和扩展
brew install homebrew/php/php56 --with-apache 报错: checking if the location of ZLIB install directory ...
- 15_游戏编程模式EventQueue
#### 两个例子 .GUI event loop ``` while (running) { // 从事件队列里获取一个事件 Event event = getNextEvent(); // Han ...
- Agc007_C Pushing Balls
传送门 题目大意 在一条直线上有$N$个球和$N+1$个洞,每两个球之间有一个洞,每两个洞之间有一个球,最左端和最右端都是洞,其中产生的$2N$个间隔满足从左到右是等差数列.你每次随机选择一个未被推进 ...
- expect 切换用户
安装expect yum install expect -y #!/bin/expect -f spawn su - expect "Password:" send "n ...
- [转]实现微信浏览器内打开App Store链接
微信浏览器是不支持打开App Store 页面的,不知道微信为什么这么做.比如你页面写 <a href=”http://itunes.apple.com/us/app/id399608199″& ...
- 有关UCOS_II在LPC1768上的应用
https://www.cnblogs.com/chungshu/archive/2012/12/14/2818380.html
- java代码用continue输出奇数——————————
总结:continue用法是:在for,do-while.while循环中 并且,continue的意思是跳出循环的剩余部分,进行下一次循环.不是下一步循环 package com.b; import ...
- RabbitMQ介绍
(一)RabbitMQ基本概念 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.我曾经对这门语言挺有兴趣,学过一段时间,后来没坚持.RabbitMQ是 AMQP(高级消息队列协议)的 ...
- How far away ?(LCA)dfs和倍增模版
How far away ? Tarjan http://www.cnblogs.com/caiyishuai/p/8572859.html Time Limit: 2000/1000 MS (Jav ...