题目

链接

大意:有一个容量为$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的更多相关文章

  1. 【BZOJ-3174】拯救小矮人 贪心 + DP

    3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 686  Solved: 357[Submit][Status ...

  2. BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP

    BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...

  3. 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp

    正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...

  4. 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp

    题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...

  5. 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp

    题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...

  6. hdu 1257 最少拦截系统【贪心 || DP——LIS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  7. 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人

    P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...

  8. 贪心+dp

    贪心+dp 好多题都是这个思想, 可以说是非常重要了 思想一: 在不确定序列无法dp的情况下, 我们不妨先假设序列已经选定, 而利用贪心使序列达到最优解, 从而先进行贪心排序, 在进行dp选出序列 思 ...

  9. 【题解】CF1056F Write the Contest(三分+贪心+DP)

    [题解]CF1056F Write the Contest(三分+贪心+DP) 最优化问题的三个解决方法都套在一个题里了,真牛逼 最优解应该是怎样的,一定存在一种最优解是先完成了耗时长的任务再干别的( ...

随机推荐

  1. 牛客小白月赛16 H 小阳的贝壳 (差分+线段树)

    链接:https://ac.nowcoder.com/acm/contest/949/H来源:牛客网 题目描述 小阳手中一共有 n 个贝壳,每个贝壳都有颜色,且初始第 i 个贝壳的颜色为 colico ...

  2. 配置了Ubuntu环境变量,系统启动不了

    修改了etc/init.d/rcS文件后重启后Ubuntu起不来了, 开启按shift+e或者直接选择,进入恢复模式 进入root shell 执行这个命令 可以有写入权限,重新挂载 mount  - ...

  3. [转帖]Mysql binlog 介绍

    binlog介绍   1.什么是binlog binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等 ...

  4. 【转帖】深挖NUMA

    深挖NUMA http://www.litrin.net/2017/10/31/深挖numa/ 首先列出本站之前相关的几篇帖子: Linux的NUMA机制 NUMA对性能的影响 cgroup的cpus ...

  5. Oracle对象-视图和索引

    Oracle 对象-视图 视图概念 ​ 视图就是提供一个查询的窗口,所有的数据来自于原表 创建视图[必须有dba权限] --查询语句创建表 create table emp as select * f ...

  6. scrapy-redis数据去重与分布式框架

    数据去重 生成指纹:利用hashlib的sha1,对request的请求体.请求url.请求方法进行加密,返回一个40位长度的16进制的字符串,称为指纹 fp = hashlib.sha1() fp. ...

  7. 剑指offer32:把数组排成最小的数

    1 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 2 思路 ...

  8. T100——汇总错误消息显示

    初始化 CALL cl_err_collect_init() 汇总消息显示 CALL cl_err_collect_show()

  9. 【hash】Seek the Name, Seek the Fame

    [哈希和哈希表]Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over ...

  10. 【IntelliJ IDEA】添加一个新的tomcat,tomcat启动无法访问欢迎页面,空白页,404

    ===================================第一部分,添加一个tomcat================================================== ...