洛谷P4095新背包问题




这道题最最暴力的方法就是对于每一个询问都跑一边多重背包问题,但显然q不会那么友好的让我们用暴力过掉这道题。
考虑优化。我们可以先把裸的多重背包搞成二进制优化后的多重背包。但是复杂度依然无法接受。接下来使用吸氧和register等玄学优化 然而你发现你还是T了
那我们可不可以记录下来第i种不选,总容量为j($1\leq j\leq 1000$时的最大价值?想法很好,但是暴力写出来复杂度还是太高(O(\(1000n^2logn\)))
for(int i=1;i=st[i]&&k=w[k];j--)
    f[i][j]=max(f[i][j],f[i][j-w[k]]+v[k]);
  }
}
    上面的程序复杂度主要高在什么地方呢?f[i][j]和f[i-1][j]相比,考虑的物品多了第i-1种物品,少了第i种物品,而其他不变。但是上面的程序枚举哪一种物品不选后就全部重新考虑了一遍,会造成很大的浪费。
为了减少浪费,我们可以把上面的f[i][j]拆成两部分。可以先算出选1i-1种物品最大价值,再算出选i+1n种物品的最大价值,枚举合并的价值即可。
Code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
const int inf=214748364;
typedef long long ll;
inline int read()
{
	char ch=getchar();
	int x=0;bool f=0;
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
    {
    	x=(x<<3)+(x<<1)+(ch^48);
    	ch=getchar();
    }
    return f?-x:x;
}
int n,w[10009],v[10009],q,t;
int st[1009],en[1009],me,meyo[300009],m[300009],dp[2009][1009],f[1009][1009],g[1009][1009];
bool have[1009][1009],ha[1009];
void Dp()
{
	for(register int duliu=1;duliu<=n;duliu++)
	{
	    for(int j=1;j<=1000;j++)
	     f[duliu][j]=f[duliu-1][j];
	    for(int i=st[duliu-1];i<=en[duliu-1];i++)
		 for(int j=1000;j>=w[i];j--)
		  f[duliu][j]=max(f[duliu][j],f[duliu][j-w[i]]+v[i]);
	}
	for(int duliu=n;duliu>=1;duliu--)
	{
		for(int j=1;j<=1000;j++)
		 g[duliu][j]=g[duliu+1][j];
		for(int i=st[duliu+1];i<=en[duliu+1];i++)
		 for(int j=1000;j>=w[i];j--)
		  g[duliu][j]=max(g[duliu][j],g[duliu][j-w[i]]+v[i]);
	}
}
int main()
{
	memset(st,0x3f,sizeof(st));
	n=read();
	for(register int i=1;i<=n;i++)
	 {
	 	int mo=read(),va=read(),num=read();
	 	int k=1;
	 	st[i]=t+1;
	 	while(num>=k)
	 	{
	 		w[++t]=mo*k;
	 		v[t]=va*k;
	 		num-=k;
			k*=2;
	 	}
	 	if(num)
	 	{
	 		w[++t]=mo*num;
	 		v[t]=va*num;
	 	}
	 	en[i]=t;
	 }
	q=read();
	for(register int i=1;i<=q;i++)
      meyo[i]=read()+1,m[i]=read(),have[meyo[i]][m[i]]=1,ha[meyo[i]]=1;
    Dp();
	for(register int i=1;i<=q;i++)
    {
    	int ans=0;
    	for(int j=0;j<=m[i];j++)
    	 ans=max(ans,f[meyo[i]][j]+g[meyo[i]][m[i]-j]);
    	printf("%d\n",ans);
    }
}
然鹅这题正解是cdq分治,but我不会
maybe窝搞完单调队列优化之后会回来写cdq分治的
希望上面那条不要变成最小鸽
洛谷P4095新背包问题的更多相关文章
- 洛谷P1242 新汉诺塔(dfs,模拟退火)
		洛谷P1242 新汉诺塔 最开始的思路是贪心地将盘子从大到小依次从初始位置移动到目标位置. 方法和基本的汉诺塔问题的方法一样,对于盘子 \(i\) ,将盘子 \(1\to i-1\) 放置到中间柱子上 ... 
- 洛谷P4095||bzoj3163 [HEOI2013]Eden 的新背包问题
		https://www.luogu.org/problemnew/show/P4095 不太会.. 网上有神奇的做法: 第一种其实是暴力(复杂度3e8...)然而可以A.考虑多重背包,发现没有办法快速 ... 
- 洛谷P1860 新魔法药水
		洛谷题目链接 动态规划: 这个题目调了我好久....结果循环变量写错了... 而且题目有个坑!!!只能用开始给你的$v$元买入东西 回归正题: 我们定义状态$ans[i][j]$表示第$i$个物品用了 ... 
- 题解——洛谷P4095 [HEOI2013]Eden 的新背包问题(背包)
		思路很妙的背包 用了一些前缀和的思想 去掉了一个物品,我们可以从前i-1个和后i+1个推出答案 奇妙的思路 #include <cstdio> #include <algorithm ... 
- 洛谷 P1305 新二叉树
		P1305 新二叉树 题目描述 输入一串完全二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n. 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输 ... 
- 洛谷P1860——新魔法药水
		传送门:QAQQAQ 题意:商店里有N种药水,每种药水都有一个售价和回收价.小S攒了V元钱,还会M种魔法,可以把一些药水合成另一种药水.他一天可以使用K次魔法,问他一天最多赚多少钱? N<=60 ... 
- 洛谷 P1305 新二叉树 Label:字符串的输出总是有惊喜
		题目描述 输入一串完全二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n. 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输出格式: 前序排列的完 ... 
- 洛谷P1242 新汉诺塔
		传送门啦 首先要将第n个盘子从x到y,那么就要把比n小的盘子全部移到6-x-y,然后将n移到y 仔细想想:6代表的是3根初始柱,3根目标柱. 6-(x+y) 便是我们的中转柱了,因为到这个位置是最优的 ... 
- 洛谷P1242 新汉诺塔  【神奇的递归】
		题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号.将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A.B.C,这个状态称为初始状态. 现在要求找到一种步数最少的移动方案,使得从初 ... 
随机推荐
- AGC015E Mr.Aoki Incubator
			atcoder luogu 首先可以考虑给一个人\(A\)染色.其他人被染色,要么被本来在后面的速度更快的人染色,要么被在前面的更慢的人染色.然后假设一个速度比最开始那个人慢的人\(B\)最后被染色了 ... 
- iphone手机软件安装目录
			iPhone系统常用文件夹位置 1.[/Applications] 常用软件的安装目录 2. [/private /var/ mobile/Media /iphone video Recorder] ... 
- JVM运行时的内存划分--JDK1.8
			对比JDK1.7,JDK1.8在运行时的内存分配上进行了调整.本篇对JDK1.8版本进行简要介绍. 先以一张图片描述运行时内存: 程序计数器 记录当前线程执行的字节码行号.如果执行的是native方法 ... 
- VMware  中的win7虚拟机在一段时间后就会自动挂起
			VMware workstation 中的win7虚拟机在一段时间不用后就会自动挂起. 其实这不是VMware workstation 的问题,而是win7的问题.关闭win7系统 的自动休眠功能即可 ... 
- PAT Advanced 1041 Be Unique (20 分)
			Being unique is so important to people on Mars that even their lottery is designed in a unique way. ... 
- PIL 中的 Image 模块
			转载:http://www.cnblogs.com/way_testlife/archive/2011/04/20/2022997.html PIL 中的 Image 模块 本文是节选自 PIL ... 
- [Python模块]Windows环境安装PyV8并执行js语句
			安装这个玩意儿真挺坑的,pip直接安装失败,windows的py库压根搜不到.. 搜索良多解决办法终于找到了,在这里贴出来,主要是把这个库下载下来再安装,但它的下载地址HERE位于外面的世界(你懂得) ... 
- 【学习】024 springCloud
			单点系统架构 传统项目架构 传统项目分为三层架构,将业务逻辑层.数据库访问层.控制层放入在一个项目中. 优点:适合于个人或者小团队开发,不适合大团队开发. 分布式项目架构 根据业务需求进行拆分成N个子 ... 
- Java基本的程序结构设计  大数操作
			大数操作 BigInteger 不可变的任意精度的整数.所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型).BigInteger 提供所有 Java 的基本整数操 ... 
- null 的应用
			它是 Oracle 中非常特殊的一种类型.它表示不确定,表示没有值.并且它能转化成所有的类型. 向数据库中插入空字符串时,oracle 会把它自动转化为 null 类型.所以,在查询空字符的时候: s ... 
