【传送门】http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5747

【题目大意】:薛定谔的背包。薛定谔的猫是只有观测了才知道猫的死活,薛定谔的背包是只有把物品放入背包中才知道物品的价值。。有两大类物品,价值分别是k1 , k2,数量分别是n,m,第一大类第i个物品的体积是S(1,i);第二大类第i个物品的体积是S(2,i)。每件物品被放入背包价值怎么算呢,只有把它放入背包之后才能算出来,该物品对于价值是 k * r;

其中k是物品原本价值,r是放入该物品之后背包的剩余体积。问这个背包所能装入的最大价值是多少?

【题解】背包问题,但又要 先做贪心的处理,为什么可以贪心呢?因为有这样一个事实,对于同一类物品,肯定是优先放体积小的,因为体积小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 <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll dp[][];
ll k1,k2,c;
int n,m;
ll ans;
ll a[],b[];
ll suma[],sumb[];
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld",&k1,&k2,&c);
scanf("%d%d",&n,&m);
for(int i = ; i <= n; i++){
scanf("%lld",&a[i]);
}
for(int i = ; i <= m; i++){
scanf("%lld",&b[i]);
}
sort(a+,a++n);
sort(b+,b++m);
suma[] = ;
for(int i = ; i <= n; i++){
suma[i] = suma[i-] + a[i];
}
sumb[] = ;
for(int i = ; i <= m; i++){
sumb[i] = sumb[i-] + b[i];
}
ans = -;
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
dp[i][j] = ;
if(i == && j == ) continue;
if(i == ){
if(c >= sumb[j]){
dp[i][j] = dp[i][j-] + k2 * (c - sumb[j]);
}
}
else if(j == ){
if(c >= suma[i]){
dp[i][j] = dp[i-][j] + k1 * (c - suma[i]);
}
}
else{
ll s = suma[i] + sumb[j];
if(c >= s){
dp[i][j] = max(dp[i][j-]+k2*(c-s),dp[i-][j]+k1*(c-s));
}
}
ans = max(ans,dp[i][j]);
}
}
printf("%lld\n",ans);
}
return ;
}

ZOJ - 4019 Schrödinger's Knapsack (背包,贪心,动态规划)的更多相关文章

  1. ZOJ 4019 Schrödinger's Knapsack

    Schrödinger's Knapsack Time Limit: 1 Second      Memory Limit: 65536 KB DreamGrid has a magical knap ...

  2. ZOJ 4019 Schrödinger's Knapsack (from The 18th Zhejiang University Programming Contest Sponsored by TuSimple)

    题意: 第一类物品的价值为k1,第二类物品价值为k2,背包的体积是 c ,第一类物品有n 个,每个体积为S11,S12,S13,S14.....S1n ; 第二类物品有 m 个,每个体积为 S21,S ...

  3. ZOJ Problem Set - 3829Known Notation(贪心)

    ZOJ Problem Set - 3829Known Notation(贪心) 题目链接 题目大意:给你一个后缀表达式(仅仅有数字和符号),可是这个后缀表达式的空格不幸丢失,如今给你一个这种后缀表达 ...

  4. CJOJ 2040 【一本通】分组背包(动态规划)

    CJOJ 2040 [一本通]分组背包(动态规划) Description 一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2, ...

  5. CJOJ 2307 【一本通】完全背包(动态规划)

    CJOJ 2307 [一本通]完全背包(动态规划) Description 设有n种物品,每种物品有一个重量及一个价值.但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干 ...

  6. 【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)

    [BZOJ5302][HAOI2018]奇怪的背包(动态规划,容斥原理) 题面 BZOJ 洛谷 题解 为啥泥萌做法和我都不一样啊 一个重量为\(V_i\)的物品,可以放出所有\(gcd(V_i,P)\ ...

  7. 【51Nod】1510 最小化序列 贪心+动态规划

    [题目]1510 最小化序列 [题意]给定长度为n的数组A和数字k,要求重排列数组从而最小化: \[ans=\sum_{i=1}^{n-k}|A_i-A_{i+k}|\] 输出最小的ans,\(n \ ...

  8. 集训第四周(高效算法设计)L题 (背包贪心)

    Description   John Doe is a famous DJ and, therefore, has the problem of optimizing the placement of ...

  9. nyoj 16-矩形嵌套(贪心 + 动态规划DP)

    16-矩形嵌套 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:13 submit:28 题目描述: 有n个矩形,每个矩形可以用a,b来描述,表示长和 ...

随机推荐

  1. mysql存储引擎中InnoDB与Myisam的区别及应用场景

    1. 区别: (1)事务处理: MyISAM是非事务安全型的,而InnoDB是事务安全型的(支持事务处理等高级处理): (2)锁机制不同: MyISAM是表级锁,而InnoDB是行级锁: (3)sel ...

  2. js 两个数组对象根据账号比较去重,解决直接splice后数组索引改变

    目的获取Arr2中不包含在arr1中的对象 根据Account进行比较,如果相等则删除tempArr数组对象. 结果返回张三 var arr1=[{"account":" ...

  3. shell脚本,awk 根据文件某列去重并且统计该列频次。

    a文件为 a a a s s d .怎么把a文件变为 a s d .怎么把a文件变为 a a a s s d 解题方法如下: 解题思路 [root@localhost study]# awk 'NR= ...

  4. shell脚本,配置文件加载顺序,以及什么时候加载。

    在linux系统中,有/etc/profile,/etc/bashrc ,~/.bash_profile,~/bashrc这四个配置文件,这些文件,会自动的在某些时候加载,也就是点一下,一般都是些别名 ...

  5. OAuth授权之回调accessToken

    具体说明见新浪官方文档 http://open.weibo.com/wiki/Oauth2/access_token   具体实现 第一步 打开回调页面 // 宏定义client_id #define ...

  6. ios之NSURLRequest&NSURLConnection

    网络编程中一般都是经过  请求--->连接--->响应   (request  -->  connection  -->  response)这个过程. 一般的步骤是这样的: ...

  7. 洛谷 P1663 山

    https://www.luogu.org/problemnew/show/P1663 可能在这里看会好一点:[题解]

  8. Mining of Massive Datasets-1

    given lots of data->discover patterns and models that are: valid, useful, unexpected, understanda ...

  9. LeetCode(9)Palindrome Number

    题目: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could neg ...

  10. python中strip(),lstrip(),rstrip()函数的讲解

    1. strip() 它的函数原型:string.strip(s[, chars]),它返回的是字符串的副本,并删除前导和后缀字符.(意思就是你想去掉字符串里面的哪些字符,那么你就把这些字符当参数传入 ...