题目

链接

大意:有一个容量为$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. session和cookie区别,多台WEB服务器如何共享session,禁用COOKIE后SESSION是否可用,为什么?

    答:session的运行机制: 用户A访问站点Y,如果站点Y指定了session_start();(以下假设session_start()总是存在)那么会产生一个session_id,这个sessio ...

  2. python os系统

    os模块中关于文件/目录常用的函数使用方法 函数名    使用方法 getcwd()  返回当前工作目录 hdir(path)  改变工作目录 listdir(path='.') 列举指定目录中的文件 ...

  3. 怎样修改 VS Code 主题?

    方法1. 点击左上角 File > Preferences > Color Theme. 方法2. 使用快捷键: Ctrl + K , Ctrl + T  PS: 查询各种操作的快捷键可以 ...

  4. Eclipse 动态添加web.xml

    在创建javaweb项目时,也许会忘记让项目创建web.xml文件,这是我们可以右键创建后的项目,在javaEE Tools中选择第二个即可. Generate deployment Descript ...

  5. 关于微信小程序中的样式使用变量值的方法

    在开发过程中,通常碰到样式非固定的情况,这时候就要使用变量来规定样式,例如,一个view的宽度需要使用变量: 1. 在wxss中,定义变量:width:var(--width--); 2. 在js中, ...

  6. java web开发跨域问题

    分布式环境,前后端分离背景下跨域问题 1.1 设置页面document.domain去把2个页面之间的跨域交互统一 一级域名相同的情况下 调用者和页面提供者进行一个协调 页面提供者要在document ...

  7. TTP223 触摸按键

    正面 反面 模式设置 可替代按键开关

  8. 8.Mapper动态代理

    在前面例子中自定义 Dao 接口实现类时发现一个问题:Dao 的实现类其实并没有干什么 实质性的工作, 它仅仅就是通过 SqlSession 的相关 API 定位到映射文件 mapper 中相应 id ...

  9. Browser Security-超文本标记语言(HTML)

    Browser Security-超文本标记语言(HTML) 瞌睡龙 · 2013/06/19 18:55 重要的4个规则: 1 &符号不应该出现在HTML的大部分节点中. 2 尖括号< ...

  10. DataTable序列化及反序列化Json

    添加Json解析引用 using Newtonsoft.Json; 实现方式一:普通转换 private void button1_Click(object sender, EventArgs e) ...