题目

链接

大意:有一个容量为$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. [转帖]ubuntu 修改 apt源的方法

    https://www.cnblogs.com/dadonggg/p/11129973.html ubuntu 和 centos 是不一样的 ubunut 里面 用deb开头 放置到 /etc/apt ...

  2. [OpenBenchMarking] AMD CPU 的性能简单对比

    来源: https://openbenchmarking.org/result/1710193-AL-EPYC7351P64 1. 2. 3. 4.

  3. appium+python教程1

    Python3+Appium安装使用教程 一.安装 我们知道selenium是桌面浏览器自动化操作工具(Web Browser Automation) appium是继承selenium自动化思想旨在 ...

  4. 关于spring 事务 和 AOP 管理事务和打印日志问题

    关于spring 事务 和 AOP 管理事务和打印日志问题 1. 就是支持事务注解的(@Transactional) . ​ 可以在server层总使用@Transactional,进行方法内的事务管 ...

  5. Chrome浏览器控制台报 POST http://*** net::ERR_BLOCKED_BY_CLIENT

    开发项目广告模块时,遇到前端提交的请求后台拿不到,好像被什么拦截了,查看了过滤器,拦截器都无错误,且请求也到不了拦截器,chrome浏览器报:ERR_BLOCKED_BY_CLIENT错误 搞腾一半天 ...

  6. MyBatis使用小结

  7. Ural 1298 Knight 题解

    目录 Ural 1298 Knight 题解 题意 题解 程序 Ural 1298 Knight 题解 题意 给定一个\(n\times n(1\le n\le8)\)的国际象棋棋盘和一个骑士(基本上 ...

  8. python 分支语句 等值判断 逻辑运算符

    # 分支语句age = 233if age < 18: print('您还未满18岁,禁止入内')elif age > 18 and age < 60: print("欢迎 ...

  9. 牛客 26C 手铐 (缩环, 树形dp)

    先缩环建树, 对于树上个环$x,y$, 假设$x,y$路径上有$cnt$个环(不包括$x,y$), 贡献就为$2^{cnt}$. 这题卡常挺严重的, 刚开始用并查集合并竟然T了. #include & ...

  10. 牛客 72C 小H和游戏 (动态点分治)

    大意: 给定树, 每个点初始权值0, 每次询问给出$x$, $x$权值+1, 求距离$x$不超过2的权值和. 这题数据范围过大, 动态点分治卡不过去, 考虑其他做法 考虑每次只加范围$1$, c[0] ...