背包 CF730J Bottles 题解
【动态规划 背包】CF730J Bottles
- 前言
- Bottles
- 题目
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 样例 #2
- 样例输入 #2
- 样例输出 #2
- 样例 #3
- 样例输入 #3
- 样例输出 #3
- 提示
- 题解
- 题意
- 流程
- I. 最小瓶子数(简单贪心)
- II. 最小时间
- Code ( AC , 100ps )
前言
此乃小 Oler 的一篇小小题解,从今日后,还会进行详细的修订。
6870ef4f-02f8-4dc3-a0b2-4ccc37f75eab
Bottles
题目
源自 洛谷 CF730J Bottles
题目描述
有 n n n 瓶水,第 i i i 瓶水的水量为 a i a_i ai,容量为 b i b_i bi。将 1 1 1 单位水从一个瓶子转移到另一个瓶子所消耗时间为 1 1 1 秒,且可以进行无限次转移。求储存所有水所需最小瓶子数 k k k 以及该情况下所用最小时间 t t t 。
输入格式
第一行输入一个正整数 n n n( 1 ≤ n ≤ 100 1\le n\le 100 1≤n≤100)。
第二行输入 n n n 个正整数,第 i i i 个正整数表示 a i a_i ai( 1 ≤ a i ≤ 100 1\le a_i \le 100 1≤ai≤100)。
第三行输入 n n n 个正整数,第 i i i 个正整数表示 b i b_i bi( 1 ≤ b i ≤ 100 1\le b_i \le100 1≤bi≤100)。
对于每一个 i i i,满足 a i ≤ b i a_i\le b_i ai≤bi 。
输出格式
输出一行两个整数: k k k 和 t t t 。
样例 #1
样例输入 #1
4
3 3 4 3
4 7 6 5
样例输出 #1
2 6
样例 #2
样例输入 #2
2
1 1
100 100
样例输出 #2
1 1
样例 #3
样例输入 #3
5
10 30 5 6 24
10 41 7 8 24
样例输出 #3
3 11
提示
在第一个例子中, Nick 可以将苏打水从第一个瓶子倒到第二个瓶子。这需要 3 3 3 秒钟。在它之后,第二瓶将包含 3 + 3 = 6 3+3=6 3+3=6 单位的苏打水。然后他可以把苏打水从第四瓶倒到第二瓶,再倒到第三瓶:一个单位到第二个,两个单位到三个。这将花费 1 + 2 = 3 1+2=3 1+2=3 秒。所以,所有的苏打水都装在两个瓶子里,他会花 3 + 3 = 6 3+3=6 3+3=6 秒来做。
题解
题意
每个水瓶有两个值,一个是初始时水瓶中的水量 v a l val val ,一个是水瓶的容量 v v v ,求通过转移,储存所有水所需最小瓶子数 k k k 以及该情况下转移所用最小时间 t t t 。
流程
I. 最小瓶子数(简单贪心)
- 求所有水瓶中的水量之和 s u m sum sum
- 把每个水瓶按容量从大到小排序
- 依次取出容量大的水瓶,直到取到大于 s u m sum sum 为止
- 把最小瓶子数存入 r e s res res 中
II. 最小时间
- 定义 f i , j , k f_{i,j,k} fi,j,k 为考虑前 i i i 个水瓶,选了 j j j 个水瓶,容量是 k k k 时水量最大值。
f i , j , k = max { f i − 1 , j , k → 不选 f i − 1 , j − 1 , k − v + v a l → 选 f_{i,j,k} = \max \begin{cases} f_{i-1,j,k} \to 不选\\ f_{i-1,j-1,k-v}+val \to 选 \end{cases} fi,j,k=max{fi−1,j,k→不选fi−1,j−1,k−v+val→选
由于数据比较大,如果直接开数组,会给你个惊喜的 MLE !!!
想到我们使用的是背包思想,所以可以省略第一维,即修改状态定义为 f j , k f_{j,k} fj,k ,选了 j j j 个水瓶,容量是 k k k 时水量和的最大值,但要注意在枚举选了 j j j 个水瓶的循环时需倒序进行。
由于要求的是在取最少个瓶子情况下的最优解,就是说明选几个水瓶是已经确定的了,即 r e s res res ,最后枚举容量为 i i i 时的水量最大值 f r e s , i f_{res,i} fres,i ,取其中的最大值,题目并没有要求转移水量的顺序,则可以随意转移,所以用原来所有水瓶中的水量和和减去选中的水瓶中的水量和(需要转移的水量),就是最小时间。
下面贴上蒟蒻的代码…
Code ( AC , 100ps )
#include<bits/stdc++.h>
using namespace std;
const int N=101;
int n,ans,f[N][N*N];
int sum,res,sum2;
struct Node {int a,b;
}d[N];
bool cmp(Node x,Node y) {return x.b>y.b;
}
int main() {scanf("%d",&n);for(int i=1;i<=n;i++) {scanf("%d",&d[i].a);sum+=d[i].a;}for(int i=1;i<=n;i++) {scanf("%d",&d[i].b);sum2+=d[i].b;}sort(d+1,d+n+1,cmp);int t=0;for(int i=1;i<=n;i++) {t+=d[i].b,res++;if(t>=sum) break;}memset(f,-0x3f3f3f3f,sizeof f);f[0][0]=0;for(int i=1;i<=n;i++) {for(int j=i;j>=1;j--) {for(int k=j*100;k>=d[i].b;k--)f[j][k]=max(f[j-1][k-d[i].b]+d[i].a,f[j][k]);}}int ans=0;for(int i=sum;i<=sum2;i++)ans=max(ans,f[res][i]);printf("%d %d\n",res,sum-ans);return 0;
}
背包 CF730J Bottles 题解相关推荐
- 「JOISC 2014 Day4」挂饰(背包DP)题解
题目翻译 JOI 君有 n n n 个装在手机上的挂饰,编号为 1 - n 1 \ldots n 1-n. JOI 君可以将其中一些挂饰装在手机上. JOI 君的挂饰有一些与众不同--其中的一些挂饰附 ...
- CF730J Bottles
01背包问题 题目链接 题目思路 先排序贪心找到需要的最少瓶子 再01背包求求所需瓶子内本来的水的最大值即可 因为总水量是一定的 如果最后方案瓶子中原来的水越多 则从外面往里倒的水越少即所需时间越少 ...
- hdu 1114Piggy-Bank(完全背包)
传送门 参考资料: [1]:https://www.cnblogs.com/jbelial/articles/2116074.html [2]:https://www.luogu.org/proble ...
- Codeforces2000分左右DP泛刷
乱七八糟的DP题随便刷刷 文章目录 CF148E - Porcelain CF1131D - Gourmet choice CF629C - Famil Door and Brackets CF895 ...
- 游戏盒子_游戏的未来不是盒子
游戏盒子 Most games today are downloaded and played on smartphones, gaming consoles, and PCs. Network co ...
- 青岛农业大学第九届ACM程序设计竞赛
Problem A 喆神装书 https://ac.nowcoder.com/acm/contest/906/A 题意:是否能够把所有的书都放在两个背包里. 题解:贪心 C++版本一 /* *@Aut ...
- DP分类题目 转载 《志当存高远》大神的 没有冒犯的意思 只是拿过来学习的
A.各种背包,就根据背包九讲的内容来做吧! --不会背包的可以边看背包九讲边练习 =========================================================== ...
- NUC-ACM/ICPC 寒假训练 简单DP A - G题
第一题:数塔 HDU - 2084 做法: 从第 i , j 个 节点往下走的最优解可以由从第 i+1,j 个节点往下走的最优解和第i+1,j+1个节点往下走的最优解得出,二者取其优即可. 代码: 记 ...
- Leetcode学习之动态规划
动态规划学习内容 1. 动态规划理论基础 什么是动态规划 动态规划的解题步骤 动态规划应该如何debug 2. 斐波那契数 思路 3. 爬楼梯 思路 4. 使用最小关系爬楼梯 思路 5. 不同路径 思 ...
- [leetcode] 总结篇
刷题推荐:https://programmercarl.com/ C++ 必备知识: vector 用法 unordered_set 与 unordered_map string 字符串操作 sort ...
最新文章
- Express 的简单使用
- Android Studio Library 模块中 Native 代码进行 debug 的一些坑
- Nginx七层负载均衡配置
- 《JUnit实战(第2版)》—第1章1.2节从零开始
- linux创建文件夹共享文件夹,Linux创建文件夹共享
- mdf mysql_mdf mysql数据库
- 软件工程之图书管理系统总体设计
- sobol灵敏度分析matlab_灵敏度分析 使用MATLAB编写
- windows设置定时任务并运行python脚本(windows任务计划)
- D - Inna and Alarm Clock
- 【MySQL | 运维篇】06、MySQL 分库分表之 MyCat 分片规则
- 融云根据关键字获取搜索聊天记录
- 启动bat文件--系统找不到指定路径
- 基于php学生信息管理系统设计
- 云计算未来是什么样子?
- oracle9i如何建表,oracle9i命令(一):手工创建数据库
- uni-app打包h5后chunk-vendors.js文件大导致页面访问缓慢解决方案
- 智能化产业园区有哪些内容?该如何建设?
- 基于人脸关键点检测的驾驶员睡意检测系统
- 你知道中国第一封电子邮件送达用了多久吗?绝对想不到
热门文章
- 电脑小问题三:执行程序,弹窗“用户账户控制”
- Jenkins安装和配置
- 2020.9.1 复旦大学考研计划记录
- 004_SSSS_ Image-to-Image Translation with Conditional Adversarial Networks
- 整机开发-最近使用的命令
- 爬虫-urllib2-Headers (常用)
- ASEMI快恢复二极管MURD560的更换方法
- leetcode1059
- integer是什么 vivado_AR# 66245: 2015.4.1 Vivado - Vivado 2015.4 更新 1 (2015.4.1) 版本说明
- 从前有棵树,叫高数,树上挂了很多人……