zoj4019 Schrödinger's Knapsack(dp)
题意:有两种物品分别为n,m个,每种物品对应价值k1,k2。有一个容量为c的背包,每次将一个物品放入背包所获取的价值为k1/k2*放入物品后的剩余体积。求问所获取的最大价值。
整体来看,优先放入体积较小的物品所获取的价值会更大。但是有两种物品,k1,k2不同,所以还需要考虑放入两种物品的先后。那么,可以写成状态转移方程,dp[i][j]=max(dp[i-1][j]+k1*(c-suma[i]-sumb[j]),dp[i][j-1]+k2*(c-suma[i]-sumb[j])),方程代表在先放入第一种物品的第i个,或第二种物品的第j个中选取更优的情况。
PS.没有dp数组清零,导致wa。
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 2005
using namespace std;
long long a[maxn],b[maxn],suma[maxn],sumb[maxn];
long long dp[maxn][maxn];
int k1,k2,c;
int n,m;
int main(){
int t;
cin >> t;
while (t--){
cin >> k1 >> k2 >> c;
cin >> n >> m;
for (int i=;i<=n;i++) cin >> a[i];
for (int i=;i<=m;i++) cin >> b[i];
a[]=;b[]=;suma[]=;sumb[]=;
sort(a+,a++n);
sort(b+,b++m);
for (int i=;i<=n;i++){
suma[i]=suma[i-]+a[i];
}
for (int i=;i<=m;i++){
sumb[i]=sumb[i-]+b[i];
} long long ans=;
for (int i=;i<=n;i++){
for (int j=;j<=m;j++){
dp[i][j]=;
}
}
for (int i=;i<=n;i++){
dp[i][]=dp[i-][]+k1*(c-suma[i]);
ans=max(ans,dp[i][]);
}
for (int j=;j<=m;j++){
dp[][j]=dp[][j-]+k2*(c-sumb[j]);
ans=max(ans,dp[][j]);
}
for (int i=;i<=n;i++){
for (int j=;j<=m;j++){
long long tmp=suma[i]+sumb[j];
if (tmp<=c)
dp[i][j]=max(dp[i-][j]+k1*(c-tmp),dp[i][j-]+k2*(c-tmp)); //先选取第一种物品中的第i个,或第二种物品中的第j个
ans=max(ans,dp[i][j]);
}
} cout << ans << endl;
}
return ;
}
zoj4019 Schrödinger's Knapsack(dp)的更多相关文章
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【CF618F】Double Knapsack(构造)
[CF618F]Double Knapsack(构造) 题面 洛谷 Codeforces 题解 很妙的一道题. 发现找两个数集很不爽,我们强制加强限制,我们来找两个区间,使得他们的区间和相等. 把区间 ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
随机推荐
- 利用ks构建ISO中的一些坑
构建ISO的基本流程 1.获取rpm包源码 2.将源码增量编译成二进制包 3.编写ks的包列表决定ISO制作时需要从什么地方(二进制仓库repo)取哪些二进制包 4.通过createiso命令并指定k ...
- 4. Configure maven in Spring Tool Suite
First of all, you need to copy the folder named like: Choose Window->Preferences->Maven->Us ...
- Windows10 Virtualization Technology虚拟化技术功能
为什么要开启VT功能,做机器学习环境搭建.运用Docker容器等等,所以首先要确认一下机器是否已经开启了VT技术功能,以此记录一下经历而已. VT是什么?为什么要开启VT?VT是一种虚拟化技术,可以扩 ...
- DB2错误码
SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 + 未限定的列名被解释为一个有相互联系的引用 + 动态SQL语句用分号结束 + 没有找到满足SQL语句的行 + 用DATA CAPTUR ...
- nodejs的优点
nodejs主要用于搭建高性能的web服务器,优点如下: 可以解决高并发,它是单线程,当访问量很多时,将访问者分配到不同的内存中,不同的内存区做不同的事,以快速解决这个线程.就像医院的分科室看病人.效 ...
- 2018.10.16 NOIP模拟 膜法(组合数学)
传送门 原题,原题,全TM原题. 不得不说天天考原题. 其实这题我上个月做过类似的啊,加上dzyodzyodzyo之前有讲过考试直接切了. 要求的其实就是∑i=lr(ii−l+k)\sum _{i=l ...
- 2018.08.20 loj#115. 无源汇有上下界可行流(模板)
传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...
- 2018.07.07 BZOJ2212: Poi2011Tree Rotations(线段树合并)
2212: [Poi2011]Tree Rotations Time Limit: 20 Sec Memory Limit: 259 MB Description Byteasar the garde ...
- [GO]关于go的waitgroup
watigroup是用来控制一组goroutine的,用来等待一组goroutine结束 比如关于kafka的消费者代码除了生硬的让程序等待一个小时,也可以这样写 package main impor ...
- 使用ntpdate校正linux系统的时间
当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间. 安装:yum install ntpdate ntpdate简单用法: # ntpdate ip # ntpdate 210 ...