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 复制

1
3 9
10 10
8 1
1 2
样例输出1

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进阶之路 二进制多重背包的更多相关文章

  1. ACM进阶之路

    第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打 出来. 3.大数(高精度)加减乘除 ...

  2. 51nod 1086 背包问题 V2 【二进制/多重背包】

    1086 背包问题 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放 ...

  3. GO语言的进阶之路-初探GO语言

    GO语言的进阶之路-初探GO语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么我们需要一门新语言 Go语言官方自称,之所以开发Go 语言,是因为“近10年来开发程序之难 ...

  4. GO语言的进阶之路-Golang字符串处理以及文件操作

    GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...

  5. GO语言的进阶之路-go的程序结构以及包简介

    GO语言的进阶之路-go的程序结构以及包简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编辑,编译和运行 A,编辑 Go程序使用UTF-8编码的纯Unicode文本编写.大 ...

  6. [总]Android高级进阶之路

    个人Android高级进阶之路,目前按照这个目录执行,执行完毕再做扩展!!!!! 一.View的绘制 1)setContentView()的源码分析 2)SnackBar的源码分析 3)利用decor ...

  7. C#进阶之路(六):表达式进行类的赋值

    好久没更新这个系列了,最近看.NET CORE源码的时候,发现他的依赖注入模块的很多地方用了表达式拼接实现的.比如如下代码 private Expression<Func<ServiceP ...

  8. JavaScript进阶之路(一)初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  9. ACM进阶计划

    ACM进阶计划ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l ...

随机推荐

  1. MapReduce-PRODUCTION-DEMAND

    [粗暴的HIVE-SQL]select xyz from abc where ty='sdk' and ret_code=0 and data_source_type=1 and dt between ...

  2. adjA=(detA)A-1

    A–>adjA 连续性 反函数

  3. ProgressBar+WebView实现自定义浏览器

    当我们使用浏览器浏览网页时,总会看到下图页面的样子,上面是一个地址栏,地址栏下面显示加载进度,加载完成后进入页面内容,带颜色的进度条总是少不了的,那样子看起来也舒服,如何实现自定义手机浏览器功能呢? ...

  4. python cookbook第三版学习笔记九:函数

    接受任意数量参数的函数. 当传入函数的参数个数很多的时候,在函数定义的时候不需要为每一个参数定义一个变量,可以用*rest的方式来包含多余的参数. 如下面的代码,*rest包含了2,3,4这3个参数. ...

  5. 小记tensorflow-1:tf.nn.conv2d 函数介绍

    tf.nn.conv2d函数介绍 Input: 输入的input必须为一个4d tensor,而且每个input的格式必须为float32 或者float64. Input=[batchsize,im ...

  6. mysql 创建用户与授权

    权限管理 我们都知道,最高权限管理者是 root 用户 , 它拥有着最高的权限操作,包括 : select(查询) ,update(修改) , delete(删除,有事没事都不要用这个,反正也不能给这 ...

  7. Spring事务超时时间可能存在的错误认识

    摘自:http://jinnianshilongnian.iteye.com/blog/1986023, 感谢作者. 1.先看代码 1.1.spring-config.xml <bean id= ...

  8. nginx负载均衡设置

    在nginx的配置文件[./conf/nginx.conf]中加入: upstream test.balance123.com { server 192.168.1.223:80; server 19 ...

  9. Cortex-M3 Bit-Banding

    Cortex-M3 Bit-Banding 1. 概述 CM3的存储器系统支持所谓的"位带"(bit-band)操作. 通过它,实现了对单一bit的原子操作.位带操作仅适用于一些特 ...

  10. Android Weekly Notes Issue #261

    Android Weekly Issue #261 June 11th, 2017 Android Weekly Issue #261 本期内容包括: Adaptive Icons; Kotlin实现 ...