QDUOJ ycb的ACM进阶之路 二进制多重背包
ycb的ACM进阶之路
发布时间: 2017年5月22日 14:30 最后更新: 2017年5月22日 14:31 时间限制: 1000ms 内存限制: 128M
ycb是个天资聪颖的孩子,他的梦想是成为世界上最伟大的ACMer。为此,他想拜附近最有威望的dalao为师。dalao为了判断他的资质,给他出了一个难题。dalao把他带到一个到处都是题的oj里对他说:“孩子,这个oj里有一些不同的题,做每一道题都需要一些时间,每一题也有它自身的rp(人品值)。我会给你一段时间,在这段时间里,你可以做一些题。如果你是一个聪明的孩子,你应该可以让做题的总rp最大。” 如果你是ycb,你能完成这个任务吗?
输入文件的第一行是一个T,表示测试组数,接下来T组每组第一行包含两个正整数N,M。M表示总共能够用来做题的时间,N代表oj里的题目的数目。接下来的N行每行包括两个的整数,分别表示做每个题的时间Ti和这道题的人品值Vi。
1 <= N, M <= 100000,
1 <= Ti, Vi <= 10
输出文件仅包含一个整数表示规定时间内可以做题得到的最大人品值。
1
3 9
10 10
8 1
1 2
3 一拿到这题首先想到了01背包,但会超时。
仔细看了数据范围1 <= Ti, Vi <= 10发现其实所有题之间肯定会出现重复情况,因为做题时间与人品值的组合最多有100种,而题目最多有100000道,因此这道题其实就是多重背包拆分后的情况。
然而普通做法(拆成一个一个)会超时,我们就可以考虑将相同的题目的数量拆成不同的数值,使得这些数值之间可以组合成小于等于题目数量的任意数值。
比如7可以拆成1,2,4,他们之间的任意几个数可以组成小于等于11的任意值。
那么怎样能够找到这些拆分后的数呢?利用二进制即可。
7的二进制为111,7可以拆成001,010,100即为1,2,4。这样就把拆成n个问题,变为拆成logn个问题集合,dp时间复杂度得到明显的优化。
#include<stdio.h>
#include<string.h> int f[],v[],w[],a[][]; int max(int x,int y)
{
return x>y?x:y;
} int main()
{
int t,n,V,x,y,c,i,j,k;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&V);
memset(a,,sizeof(a));
for(i=;i<=n;i++){
scanf("%d%d",&x,&y);
a[x][y]++; //将重复问题存到一起,01转化多重
}
memset(f,,sizeof(f));
memset(v,,sizeof(v));
memset(w,,sizeof(w));
c=;
for(i=;i<=;i++){
for(j=;j<=;j++){
if(a[i][j]!=){
for(k=;k<=a[i][j];k<<=){ //拆分优化
c++;
v[c]=k*i;
w[c]=k*j;
a[i][j]-=k;
}
if(a[i][j]>){
c++;
v[c]=a[i][j]*i;
w[c]=a[i][j]*j;
}
}
}
}
for(i=;i<=c;i++){ //c的大小约为logn
for(j=V;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
printf("%d\n",f[V]);
}
return ;
}
QDUOJ ycb的ACM进阶之路 二进制多重背包的更多相关文章
- ACM进阶之路
第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打 出来. 3.大数(高精度)加减乘除 ...
- 51nod 1086 背包问题 V2 【二进制/多重背包】
1086 背包问题 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放 ...
- GO语言的进阶之路-初探GO语言
GO语言的进阶之路-初探GO语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么我们需要一门新语言 Go语言官方自称,之所以开发Go 语言,是因为“近10年来开发程序之难 ...
- GO语言的进阶之路-Golang字符串处理以及文件操作
GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...
- GO语言的进阶之路-go的程序结构以及包简介
GO语言的进阶之路-go的程序结构以及包简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编辑,编译和运行 A,编辑 Go程序使用UTF-8编码的纯Unicode文本编写.大 ...
- [总]Android高级进阶之路
个人Android高级进阶之路,目前按照这个目录执行,执行完毕再做扩展!!!!! 一.View的绘制 1)setContentView()的源码分析 2)SnackBar的源码分析 3)利用decor ...
- C#进阶之路(六):表达式进行类的赋值
好久没更新这个系列了,最近看.NET CORE源码的时候,发现他的依赖注入模块的很多地方用了表达式拼接实现的.比如如下代码 private Expression<Func<ServiceP ...
- JavaScript进阶之路(一)初学者的开始
一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...
- ACM进阶计划
ACM进阶计划ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l ...
随机推荐
- Windows 下Nexus搭建Maven私服
nexus下载地址: http://www.sonatype.org/nexus/archived/#step2top 1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven ...
- 九度OJ 1082:代理服务器 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1871 解决:574 题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务器的IP地 ...
- mysql批量插入测试数据
一.建表语句 use test; create table student( Sno ) NOT NULL COMMENT '学号', Sname ) NOT NULL COMMENT '姓名', S ...
- 【题解】AT2043 AND Grid
[题解]AT2043 AND Grid 我们考虑直接构造两个互补的图切分别联通的图,然后原图有的大家都有就构造完成了. #include<iostream> #include<cst ...
- 流畅python学习笔记第十八章:使用asyncio编写服务器
在这一章中,将使用asyncio写一个TCP服务器.这个服务器的作用是通过规范名称查找Unicode字符,来看下代码: import asyncio from charfinder import Un ...
- 在JDK 6和JDK 7的substring()方法的区别?
原文链接:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/ 在JDK 6和JDK 7中subs ...
- Java for LeetCode 129 Sum Root to Leaf Numbers
Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...
- PAT 天梯赛 L2-028. 秀恩爱分得快 【数据处理】
题目链接 https://www.patest.cn/contests/gplt/L2-028 思路 0.只处理被询问的情侣的亲密度,否则会超时 1.要注意输入数字要用字符串,还要标记性别 因为 输出 ...
- [egret+pomelo]实时游戏杂记(2)
[egret+pomelo]学习笔记(1) [egret+pomelo]学习笔记(2) [egret+pomelo]学习笔记(3) pomelo pomelo服务端介绍(game-server/con ...
- pycharm解决Inconsistent indentation:mix of tabs and spaces