Codeforce 370J Bottles(动态规划-01背包)
题目链接:http://codeforces.com/problemset/problem/730/J
题目大意:有n个杯子, 每个杯子有两个值一个是已装水量,一个是可装水量。从一个杯子向另一个杯子倒1单位体积的水,时间花费为1s。 现在用n个杯子中的s个来装所有水, 求最小的s, 以及最少花费的时间。
解题思路:有了n杯水的总水量, 可以按照n个杯子的大小排序, 然后就可以求出最小的s。然后就可以将题目看做是求从n个杯子里面选s个,这s个杯子的总的可装水量是大于等于总水量,这种情况下这n个杯子实际装水量的最大值。因为,这s个杯子是可以装下所有水的, 那么花费时间不就其他n-s个杯子里面的总水量, 那么这n-s个杯子的总水量越小那么花费时间越少, 那么就是这s个杯子水量越大。
定义:dp[i][j][k]代表第i个杯子,可装水量为j时, 已选k个杯子的最大实际装水量。
那么递推方程应为dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][i-a[x]][k-1] + b[x]),然后可以优化成二维的,即可求解:
代码如下:
#include<bits/stdc++.h>
using namespace std; pair<int, int> par[];
int dp[][]; bool cmp(const int &a, const int &b)
{
return a > b;
} pair<int, int> cou(int n)
{
int res[], f = ;
for(int i=; i<=n; ++ i)
f += par[i].first, res[i] = par[i].second;
sort(res + , res + n + , cmp);
int s = ;
for(int i=; i<=n; ++ i)
{
s += res[i];
if(s >= f)
return make_pair(s, i);
}
} int main()
{
int n;
scanf("%d", &n); int s = ;
for(int i=; i<=n; ++ i)
{
scanf("%d", &par[i].first);
s += par[i].first;
}
for(int i=; i<=n; ++ i)
scanf("%d", &par[i].second); pair<int, int> t = cou(n);
for(int i=; i<=t.first; ++ i)
{
for(int k=; k<= t.second; ++ k)
{
dp[i][k] = -;
}
}
dp[][] = ;
for(int i=; i<=n; ++ i)
{
for(int j=t.first; j>=par[i].second; -- j)
{
for(int k=; k<=t.second; ++ k)
{
dp[j][k] = max(dp[j][k], dp[j-par[i].second][k-] + par[i].first);
}
}
}
int mx = ;
for(int i=s; i<=t.first; ++ i)
{
if(dp[i][t.second] > mx)
mx = dp[i][t.second];
}
printf("%d %d\n", t.second, s - mx);
}
Codeforce 370J Bottles(动态规划-01背包)的更多相关文章
- Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)
传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...
- 【洛谷】【动态规划/01背包】P2925 [USACO08DEC]干草出售Hay For Sale
[题目描述:] 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每一包都有它 ...
- 【洛谷】【动态规划/01背包】P1734 最大约数和
[题目描述:] 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. [输入格式:] 输入一个正整数S. [输出格式:] 输出最大的约数之和. [算法分析:] 01背包,每个数 ...
- (动态规划 01背包 打印路径) CD --UVA --624
链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87813#problem/G 每个CD的时间不超过 20没有哪个CD的时间是超过N ...
- HDU 2546.饭卡-动态规划0-1背包
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- WUSTOJ 1311: 开心的金明(Java)动态规划-01背包
题目链接:
- WUSTOJ 1308: 采药(Java)动态规划-01背包
题目链接:
- 动态规划-01背包-Tallest Billboard
2020-02-07 17:46:32 问题描述: 问题求解: 解法一:BF 看问题规模看似可以直接暴力解决. 如果直接去解肯定是会超时的,因为每次将原空间划分成A区域,B区域和剩余区域的时间复杂度为 ...
- HihoCoder - 1038 01背包 动态规划
#1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...
随机推荐
- 十、DG
1.DG是dependency graph,我认为是依赖图,和DAG(有向无环图)的区别:DAG用来做场景管理,每个node代表的不是tranform就是shape,有父子关系. DG是代表了每个实体 ...
- C#实用技能篇
Redis配置文件详解 如果不指定配置文件,redis也可以启动,此时,redis使用默认的内置配置.不过在正式环境,常常通过配置文件[通常叫redis.conf]来配置redis. redis.co ...
- java温故系列之环境配置
-----下面的配置符号全部复制,否则会出错 JDK配置: 首先去度娘下载jdk,然后安装.这个就不贴地址了,可能会找不到 1.右键我的电脑->属性->高级系统设置->环境变量 2. ...
- 软件测试之loadrunner学习笔记-01事务
loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...
- 进击的docker 一 : Docker 简介
Docker简介 1.什么是docker 1.1.docker 起源 开源项目 诞生2013年初 GO语言开发实现 遵从了Apache2.0协议 项目代码在GitHub维护 1.2.docker目标 ...
- 1,SFDC 开发篇 - 类对象和SOQL查询
1,类对象 & 接口 & 属性 2, Object & SOQL
- jsp+tomcat+mysql+sevlet+javabean配置过程
在配置jsp开发环境的过程中会碰到不少问题,感谢网上的许多前辈的经验总结,作者cl41的JSP连接Mysql数据库攻略和作者Saulzy的MySQL学习笔记等文章对我来说简直是雪中送碳,为了帮助象我一 ...
- C#读写者线程(用AutoResetEvent实现同步)(转载)
C#读写者线程(用AutoResetEvent实现同步) 1. AutoResetEvent简介 通知正在等待的线程已发生事件.无法继承此类. 常用方法简介: AutoResetEvent(bool ...
- ajax通讯之格式详解
前言: ajax的出现,一定程度上改变了js的命运,同时也被广泛使用,而jq的兴起也大大降低了ajax的使用难度.虽然,jq的ajax方法使用起来十分便利,但是大部分开发人员也仅仅只是对其中的几个属性 ...
- Tomcat日志切割
下载并解压缩 cronolog # tar zxvf cronolog-1.6.2.tar.gz 2.进入cronolog安装文件所在目录 # cd cronolog-1.6.2 3.运行安装 # ...