【动态规划 背包】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. 最小瓶子数(简单贪心)
    1. 求所有水瓶中的水量之和 s u m sum sum
    1. 把每个水瓶按容量从大到小排序
    1. 依次取出容量大的水瓶,直到取到大于 s u m sum sum 为止
    1. 最小瓶子数存入 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 题解相关推荐

  1. 「JOISC 2014 Day4」挂饰(背包DP)题解

    题目翻译 JOI 君有 n n n 个装在手机上的挂饰,编号为 1 - n 1 \ldots n 1-n. JOI 君可以将其中一些挂饰装在手机上. JOI 君的挂饰有一些与众不同--其中的一些挂饰附 ...

  2. CF730J Bottles

    01背包问题 题目链接 题目思路 先排序贪心找到需要的最少瓶子 再01背包求求所需瓶子内本来的水的最大值即可 因为总水量是一定的 如果最后方案瓶子中原来的水越多 则从外面往里倒的水越少即所需时间越少 ...

  3. hdu 1114Piggy-Bank(完全背包)

    传送门 参考资料: [1]:https://www.cnblogs.com/jbelial/articles/2116074.html [2]:https://www.luogu.org/proble ...

  4. Codeforces2000分左右DP泛刷

    乱七八糟的DP题随便刷刷 文章目录 CF148E - Porcelain CF1131D - Gourmet choice CF629C - Famil Door and Brackets CF895 ...

  5. 游戏盒子_游戏的未来不是盒子

    游戏盒子 Most games today are downloaded and played on smartphones, gaming consoles, and PCs. Network co ...

  6. 青岛农业大学第九届ACM程序设计竞赛

    Problem A 喆神装书 https://ac.nowcoder.com/acm/contest/906/A 题意:是否能够把所有的书都放在两个背包里. 题解:贪心 C++版本一 /* *@Aut ...

  7. DP分类题目 转载 《志当存高远》大神的 没有冒犯的意思 只是拿过来学习的

    A.各种背包,就根据背包九讲的内容来做吧! --不会背包的可以边看背包九讲边练习 =========================================================== ...

  8. NUC-ACM/ICPC 寒假训练 简单DP A - G题

    第一题:数塔 HDU - 2084 做法: 从第 i , j 个 节点往下走的最优解可以由从第 i+1,j 个节点往下走的最优解和第i+1,j+1个节点往下走的最优解得出,二者取其优即可. 代码: 记 ...

  9. Leetcode学习之动态规划

    动态规划学习内容 1. 动态规划理论基础 什么是动态规划 动态规划的解题步骤 动态规划应该如何debug 2. 斐波那契数 思路 3. 爬楼梯 思路 4. 使用最小关系爬楼梯 思路 5. 不同路径 思 ...

  10. [leetcode] 总结篇

    刷题推荐:https://programmercarl.com/ C++ 必备知识: vector 用法 unordered_set 与 unordered_map string 字符串操作 sort ...

最新文章

  1. Express 的简单使用
  2. Android Studio Library 模块中 Native 代码进行 debug 的一些坑
  3. Nginx七层负载均衡配置
  4. 《JUnit实战(第2版)》—第1章1.2节从零开始
  5. linux创建文件夹共享文件夹,Linux创建文件夹共享
  6. mdf mysql_mdf mysql数据库
  7. 软件工程之图书管理系统总体设计
  8. sobol灵敏度分析matlab_灵敏度分析 使用MATLAB编写
  9. windows设置定时任务并运行python脚本(windows任务计划)
  10. D - Inna and Alarm Clock
  11. 【MySQL | 运维篇】06、MySQL 分库分表之 MyCat 分片规则
  12. 融云根据关键字获取搜索聊天记录
  13. 启动bat文件--系统找不到指定路径
  14. 基于php学生信息管理系统设计
  15. 云计算未来是什么样子?
  16. oracle9i如何建表,oracle9i命令(一):手工创建数据库
  17. uni-app打包h5后chunk-vendors.js文件大导致页面访问缓慢解决方案
  18. 智能化产业园区有哪些内容?该如何建设?
  19. 基于人脸关键点检测的驾驶员睡意检测系统
  20. 你知道中国第一封电子邮件送达用了多久吗?绝对想不到

热门文章

  1. 电脑小问题三:执行程序,弹窗“用户账户控制”
  2. Jenkins安装和配置
  3. 2020.9.1 复旦大学考研计划记录
  4. 004_SSSS_ Image-to-Image Translation with Conditional Adversarial Networks
  5. 整机开发-最近使用的命令
  6. 爬虫-urllib2-Headers (常用)
  7. ASEMI快恢复二极管MURD560的更换方法
  8. leetcode1059
  9. integer是什么 vivado_AR# 66245: 2015.4.1 Vivado - Vivado 2015.4 更新 1 (2015.4.1) 版本说明
  10. 从前有棵树,叫高数,树上挂了很多人……