题目

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. Aquameta 基于postgresql的web 开发平台

    Aquameta 是一个完全基于pg 开发的web平台 ,目前还在开发中. 当前支持的功能 meta 写入系统信息到pg bundle 基于pg 类似git 的文件系统 filesystem 双向文件 ...

  2. redisql 试用

    redisql 是一个redis 模块,可以让redis 支持sql 查询,基于rust编写 具有以下特性 快速,每秒130k的插入 使用标准sql 容易操作,基于redis,使用标准的redis 二 ...

  3. itertools 高效的循环

    在打印内容字节数较小时,全部载入内存后,再打印,没有问题.可是,如果现在有成千上百万条车辆行驶轨迹,叫你分析出其中每个客户的出行规律,堵车情况等,假如是在单机上处理这件事. 你可能首先要面临,也可能被 ...

  4. 16-网页,网站,微信公众号基础入门(网页版MQTT,页面控件位置调整入门)

    https://www.cnblogs.com/yangfengwu/p/11200767.html 说一下,只要你java学的很好,那么几乎所有的语言都不在话下了 来看一下样式设置 运行 在左上角感 ...

  5. 读RAM时的时序风险

    读RAM时的时序有两个风险:1.数据已经存储好,读所需的时间.2.数据同时更新,读所需的时间节点.对于前者,只要延时足够节拍就行.对于后者,还必须要考虑数据建立的时间,同样延时的准备可能会因为数据尚未 ...

  6. 在微信小程序页面间传递数据总结

    在微信小程序页面间传递数据 原文链接:https://www.jianshu.com/p/dae1bac5fc75 在开发微信小程序过程之中,遇到这么一些需要在微信小程序页面之间进行数据的传递的情况, ...

  7. 经典算法(三) 单链表 反转 & 是否相交/成环 & 求交点 等

    参考文章: 判断链表是否相交:http://treemanfm.iteye.com/blog/2044196 一.单链表反转 链表节点 public class Node { private int ...

  8. JavaScript初探系列(九)——BOM

    一.什么是BOM? BOM:Browser Object Model 是浏览器对象模型,浏览器对象模型提供了独立与内容的.可以与浏览器窗口进行互动的对象结构,BOM由多个对象构成,其中代表浏览器窗口的 ...

  9. [asm] 小菜汇编基础和学习技巧小结(一)

    以下小结纯属小菜自学过程产生的dump,大神请飘过! 汇编是一门庞大复杂的学问,在计算机的世界里差不多无所不入.很多编程领域都会或多或少跟汇编打交道.本人不是科班出身的程序员,所以很多基础都为零,学历 ...

  10. Vue 与 动态组件 import 的尝试

    <template> <component :is='fuck' :data='data'></component> </template> <s ...