题目

Maxtir 最近买了一个背包。

Maxtir 有一个容量为 m 的背包。Sao 有 n 种物品,第 i 种物品的体

积为 ai ,价值为 b i 。Sao 的每种物品都有无限多件,Maxtir 可以任取。

在不超过背包容量的前提下,Maxtir 要求所能获得的最大价值。

输入输出

输入格式

第1行输入两个正整数 n , m 。

第 2 至 n + 1行,每行输入两个正整数 ai , b i 。

输出格式

一个整数,表示 Maxtir 所能获得的最大价值。

输入样例#1

2 15

3 2

5 3

输出样例#1

10

输入样例#2

3 70

71 100

69 1

1 2

140

输入/输出样例#3

见下发文件 backpack3.in/backpack3.out

数据范围

对于 20% 的数据, n , m ≤ 103 。

对于 40% 的数据, n , m ≤ 10 4 , ai , b i ≤ 10 。

对于 60% 的数据, n , m ≤ 105 。

对于 100% 的数据, n ≤ 10 6 , m ≤ 10 16 , ai , b i ≤ 100 。

分析

本人40pts的方法就不说了,放下正确分析:

按照NOIP的惯例,此题是一道送分题。

对于 60% 的数据,我们可以发现其实 n不大于100 ,若两种物品 ai 相同,

则 bi 较小的应该被舍弃,复杂度 O(am) 。

对于100 % 的数据,我们先证明一个引理:

引理:给定任意 n 个整数,它们之中存在若干个整数的和为 n 的

倍数。

证明:设 n 个整数为 a 1 , a 2 , a3 ,……, a n , \(Sn=\sum_{i=1}^{n}ai\)。

对于 S0 , S1 , S 2 , S 3 ,…… , Sn 这 n+1 个数,至少有两个数模 n 相同,则

这两个数的差为 n 的倍数,证毕。

回到题目,设第 s 种物品为性价比最高的物品之中 ai 最小的物

品。设最优情况下有 x 件非第 s 种物品,则我们可以证明:

定理:存在一种最优情况使得 x < as 。

证明:若 x >= as ,则存在若干件物品的 ai 和为 as 的倍数,将这些物

品用第 s 种物品替换一定不劣。

于是这 x 件非第 s 种物品的 ai 和最大为 100a s 。于是我们选择

(n/as)-100 件第 s 种物品,剩下的空间做完全背包,复杂度 O(a^3)。

代码

#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int M = 105;
const int N = 2e4 + 50;
ll m, ans, cnt, f[N];
int n, p[M][M]; struct Data {
int x, y; Data(int _x = 0, int _y = 0): x(_x), y(_y) {} bool operator < (const Data &t) const {
int flag = x * t.y - y * t.x;
if (flag == 0) return x < t.x;
return flag < 0;
}
} a[M]; int main() {
freopen("backpack.in", "r", stdin);
freopen("backpack.out", "w", stdout);
scanf("%d%I64d", &n, &m);
for (int x, y; n--; ) {
scanf("%d%d", &x, &y);
p[x][y] = 1;
}
n = 0;
for (int x = 1; x <= 100; x++) {
for (int y = 100; y >= 1; y--) {
if (p[x][y]) {
a[++n] = Data(x, y);
break;
}
}
}
for (int i = 2; i <= n; i++)
if (a[i] < a[1]) swap(a[i], a[1]);
cnt = m / a[1].x - 100;
ans = cnt * a[1].y;
m -= cnt * a[1].x;
for (int i = 1; i <= n; i++)
for (int j = a[i].x; j <= m; j++)
f[j] = max(f[j], f[j - a[i].x] + a[i].y);
printf("%I64d\n", ans + f[m]);
return 0;
}

NOIP模拟day1-T1(完全背包)的更多相关文章

  1. HGOI20180817 (NOIP模拟Day1 task)

    HGOI自测 初测:150=80+20+50 rank1~rank3(并列3个rank1,所以我是rank3 qwq) 今日分突然想简约 CF359A Table https://www.luogu. ...

  2. 洛谷P1328==codevs3716 生活大爆炸版石头剪刀布[NOIP 2014 day1 T1]

    P1328 生活大爆炸版石头剪刀布 1.8K通过 2.6K提交 题目提供者2014白永忻 标签模拟NOIp提高组2014 难度普及- 提交该题 讨论 题解 记录 最新讨论 Who can help m ...

  3. 20161007 NOIP 模拟赛 T1 解题报告

    排序 3.1 题意描述 众所周知,熟练掌握至少一种排序算法是参加NOIP的必备技能.常见的排序算法有冒泡 排序.归并排序.快速排序.奇偶排序.猴子排序.梳排序.鸡尾酒排序.臭皮匠排序等. 在这里,介绍 ...

  4. noip 2016 day1 T1玩具谜题

    题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singer告诉 ...

  5. 【2019.7.20 NOIP模拟赛 T1】A(A)(暴搜)

    打表+暴搜 这道题目,显然是需要打表的,不过打表的方式可以有很多. 我是打了两个表,分别表示每个数字所需的火柴棒根数以及从一个数字到另一个数字,除了需要去除或加入的火柴棒外,至少需要几根火柴棒. 然后 ...

  6. 【2019.7.25 NOIP模拟赛 T1】变换(change)(思维+大分类讨论)

    几个性质 我们通过推式子可以发现: \[B⇒AC⇒AAB⇒AAAC⇒C\] \[C⇒AB⇒AAC⇒AAAB⇒B\] 也就是说: 性质一: \(B,C\)可以相互转换. 则我们再次推式子可以发现: \[ ...

  7. 20161022 NOIP模拟赛 T1 解题报告

    旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起 ...

  8. 20161023 NOIP 模拟赛 T1 解题报告

    Task 1.纸盒子 (box.pas/box.c/box.cpp) [题目描述] Mcx是一个有轻度洁癖的小朋友.有一天,当他沉溺于数学卷子难以自拔的时候,恍惚间想起在自己当初学习概率的时候准备的一 ...

  9. 20161004 NOIP 模拟赛 T1 解题报告

    第1题  小麦亩产一千八 [问题描述] “有了金坷垃,肥料一袋能顶两袋撒,小麦亩产一千八,吸收两米下的氮磷钾……”,话说HYSBZ(Hengyang School for Boys & Zy) ...

  10. 2014.7建兰NOIP模拟Day1 Running

    突然间翻到着题,想想那时的我真是垃圾,这么简单的tarjan缩点+树上倍增都不会..还想了3h+.. 什么时候写了它吧...

随机推荐

  1. (尚033)Vue_案例_slot(组件间的通信4:slot)

    1.组件间的通信4:slot(slot:插槽,就是一个占位) slot用于标签反复使用很多次 1.1理解 此方式用于父组件向子组件传递标签数据, 其他为数据通信 外面组件向里面组件传递标签进去,直接拿 ...

  2. 8-ESP8266 SDK开发基础入门篇--编写串口上位机软件

    https://www.cnblogs.com/yangfengwu/p/11087558.html 咱用这个编写 ,版本都无所谓哈,只要自己有就可以,不同版本怎么打开 https://www.cnb ...

  3. csp 201903-3 损坏的RAID5

    问题描述 试题编号: 201903-3 试题名称: 损坏的RAID5 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 答题栏     核

  4. 【CSGRound2】逐梦者的初心(洛谷11月月赛 II & CSG Round 2 T3)

    题目描述# 给你一个长度为\(n\)的字符串\(S\). 有\(m\)个操作,保证\(m≤n\). 你还有一个字符串\(T\),刚开始为空. 共有两种操作. 第一种操作: 在字符串\(T\)的末尾加上 ...

  5. k8s实现灰度发布

    灰度发布在实际生产部署中是经常被使用的方式,常规的方法是手动从前端LB(负载均衡)上将后端服务器摘掉,然后,停服务,最后上传代码,完成软连接更新.在使用CI/CD工具时,这个过程变得自动化了,我们只需 ...

  6. MyBatis试题

    在使用MyBatis的时候,除了可以使用@Param注解来实现多参数入参,还可以用()传递多个参数值. (选择一项) A.用Map对象可以实现传递多参数值 B.用List对象可以实现传递多参数值 C. ...

  7. 服务器负载过高问题分析-不是cpu高负载也不是IO负载如何处理(阿里 几乎是必考题)

    关于top命令 经常问load average 参考:load average 定义(网易面试) jvm dump的使用 参考:Jvm dump jstack jmap jstat 介绍与使用(内存与 ...

  8. ubuntu之路——day17.1 用np.pad做padding

    网上对np.pad的解释很玄乎,举的例子也不够直观,看了更晕了,对于CNN的填充请参考下面就够用了: np.pad的参数依次是目标数组,多增加的维数可以理解为一张图的前后左右增加几圈,设置为'cons ...

  9. BERT模型

    BERT模型是什么 BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为de ...

  10. Pandas 与 Numpy 常用方法总结

    Lambda 函数实现 简单的说,lambda 就是一个函数,但是这个函数没有名字,所以我们介绍一下这个函数的调用形式,参数与返回值的实现. lambda 的格式如下: lambda [arg1 [, ...