【传送门】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. iCheck获取单选和复选框的值和文本

    //获取单选和复选框的值//parameters.type:"radio","checkbox"//parameters.name:input-name//pa ...

  2. 业务系统中最核心的状态设计,异常 case. (系统设计)

    系统设计几方面 1. 具象: 几个角色 -- 用例 2. 具象: 边界模块 3. 具象: 实体模块 4. 抽象: 详细设计后,抽出公用的部分. 5. Status状态字段的设置和更改 系统设计中最核心 ...

  3. shelll脚本,常见的脚本题目。

    [root@localhost wyb]# cat 2quan.sh #!/bin/bash #写一个脚本,先要求输入用户名,然后让他输入一个数字,输的如果是数字给输出yes,不是数字,输出no #然 ...

  4. Nginx代理tcp端口实现负载均衡

    Nginx代理tcp端口实现负载均衡 1.修改配置文件 vi /etc/nginx/nginx.conf 添加如下配置: stream { ###XXX upstream notify {   has ...

  5. Hanoi双塔问题

    题目描述: 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上 ...

  6. Python赋值运算及流程控制

    1. 内置函数 1> len:统计元素长度 str1 = 'wonderful' print(len(str1)) result: li = [,,] print(len(li)) result ...

  7. 三段式fsm

    1.状态转移的always中CS,同步ouput的always中NS. 2.3段fsm vs 2段fsm:output逻辑是组合逻辑和同步时序逻辑(消除里不稳的和毛刺). 3.3段fsm vs 1段f ...

  8. python datetime,time时间格式和用法

    我是转载的这个大神的   他的网址:https://www.cnblogs.com/wanglinjie/p/9226926.html #以下是time的方法 >>> import ...

  9. Python之路-基础数据类型之字典 集合

    字典的定义-dict 字典(dict)是python中唯⼀的⼀个映射类型.他是以{ }括起来的键值对组成,字典是无序的,key是不可修改的.dic = {1:'好',2:'美',3:'啊'} 字典的操 ...

  10. poj 1502

    MPI Maelstrom Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12087   Accepted: 7464 De ...