ZOJ4019——贪心&&DP
题目
大意:有一个容量为$c$的背包,有$n$个$s_1$类物体,价值都为$k_1$,体积分别为$s_{1,1}, s_{1,2}, \cdots, s_{1,n}$,有$m$个$s_2$类物体,价值都为$k_2$体积分别为$s_{2,1}, s_{2,2}, \cdots, s_{2,m}$,求背包能装下的最大价值。(价值的计算方法:$k_i * (c - s_i)$)
分析
背包问题,但又要 先做贪心的处理,为什么可以贪心呢?因为有这样一个事实,对于同一类物品,肯定是优先放体积小的,因为体积小r就大,因此先对两类物品按照体积分别排序。
所以最终选的物品的结果肯定是第一类物品的前i项,第二类物品的前j项 $(i,j >= 0)$
所以我们可以很轻松地定义DP中的“状态”了。定义$dp[i][j]$为取了第一类物品的前$i$项,第二类物品的前$j$项 所获得的价值。
状态转移方程 :
$dp[i][j] = max \{ dp[i-1][j] + (C - Sum1[i] - Sum2[j] )*k1, \ \ dp[i][j-1] + (C - Sum2[j] - Sum1[i] )*k1 \}$
其中$Sum1 $是第一类物品体积前缀和,$Sum2$ 是第二类物品体积前缀和。
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = + ;
const int maxm = + ;
int k1, k2, cap, n, m;
int s1[maxn], s2[maxm];
ll sum1[maxn], sum2[maxm], dp[maxn][maxm]; int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d", &k1, &k2, &cap);
scanf("%d%d", &n, &m);
for(int i = ;i <= n;i++) scanf("%d", &s1[i]);
for(int i = ;i <= m;i++) scanf("%d", &s2[i]);
sort(s1+, s1+n+);
sort(s2+, s2+m+);
for(int i = ;i <= n;i++) sum1[i] = sum1[i-] + s1[i]; //可以看作只从一者取,也可看做初始化边界
for(int i = ;i <= m;i++) sum2[i] = sum2[i-] + s2[i]; // ll ans = -;
for(int i=; i <= n;i++)
{
if(cap < sum1[i]) break;
dp[i][] = dp[i-][] + (cap - sum1[i]) * k1;
ans = max(ans, dp[i][]);
}
for(int i=; i <= m;i++)
{
if(cap < sum2[i]) break;
dp[][i] = dp[][i-] + (cap - sum2[i]) * k2;
ans = max(ans, dp[][i]);
} for(int i = ;i <= n;i++)
for(int j = ;j <= m;j++)
{
if(cap < sum1[i]+sum2[j]) break;
dp[i][j] = max(dp[i-][j] + k1 * (cap - sum1[i] - sum2[j]), dp[i][j-] + k2 * (cap - sum1[i] - sum2[j]));
ans = max(ans, dp[i][j]);
}
printf("%lld\n", ans);
}
return ;
}
参考链接:
1. 分析 https://www.cnblogs.com/czsharecode/p/9606768.html
2. 代码 https://blog.csdn.net/qq_41156122/article/details/79855315
ZOJ4019——贪心&&DP的更多相关文章
- 【BZOJ-3174】拯救小矮人 贪心 + DP
3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 686 Solved: 357[Submit][Status ...
- BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP
BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...
- 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp
正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...
- 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp
题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...
- 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp
题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...
- hdu 1257 最少拦截系统【贪心 || DP——LIS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人
P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...
- 贪心+dp
贪心+dp 好多题都是这个思想, 可以说是非常重要了 思想一: 在不确定序列无法dp的情况下, 我们不妨先假设序列已经选定, 而利用贪心使序列达到最优解, 从而先进行贪心排序, 在进行dp选出序列 思 ...
- 【题解】CF1056F Write the Contest(三分+贪心+DP)
[题解]CF1056F Write the Contest(三分+贪心+DP) 最优化问题的三个解决方法都套在一个题里了,真牛逼 最优解应该是怎样的,一定存在一种最优解是先完成了耗时长的任务再干别的( ...
随机推荐
- [转帖] 修改nginx 默认上传文件大小
nginx默认会限制上传文件的大小为1M https://blog.51cto.com/ycgit/1563307 艺晨光关注0人评论12037人阅读2014-10-13 15:29:50 htt ...
- php静态调用非静态方法
<?php /** * php静态调用非静态方法 * author: 百里 * Date: 2019/7/18 * Time: 17:28 */ function dump(...$var) { ...
- 解决python语言在cmd下中文乱码的问题
解决python语言在cmd下中文乱码的问题: a = "再见!"print (a.decode('utf-8').encode('gbk')) #解决在cmd下中文乱码的问题
- git 使用2
安装 1.下载对应版本:https://git-scm.com/download 2.安装git:在选取安装路径的下一步选取 Use a TrueType font in all console wi ...
- golang数据类型
整数类型 Golang各整数类型分:有符号和无符号,int uint 的大小和系统有关. Golang查看一个变量的数据类型: package main import "fmt" ...
- MySQL SQL Training
源于知乎:50道SQL练习题 一.表数据 1.学生表——Student ),Sname ),Sage )); ' , '赵雷' , '1990-01-01' , '男'); ' , '钱电' , '1 ...
- 怎样修改 VS Code 主题?
方法1. 点击左上角 File > Preferences > Color Theme. 方法2. 使用快捷键: Ctrl + K , Ctrl + T PS: 查询各种操作的快捷键可以 ...
- vue项目中导出PDF的两种方式
参考大家导出的方式,基本上是如下两种: 1.使用 html2Canvas + jsPDF 导出PDF, 这种方式什么都好,就是下载的pdf太模糊了.对要求好的pdf这种方式真是不行啊! 2.调用浏览器 ...
- SIP中From ,Contact, Via 和 Record-Route/Route
转载:http://eadgar.blogbus.com/logs/374635.html 注意:以下内容适用于SIP消息中,在具体的应用环境中,例如IMS,每个消息头都有其他独特的意义,但不会和以下 ...
- 今日js心得
<input type="hidden" id="history_chart_json" data-json="#{smartDeviceMon ...