2159 ACM 杭电 杀怪 二维费用的背包+完全背包问题
题意:已知经验值,保留的忍耐度,怪的种数和最多的杀怪数。求进入下一级的最优方案。
思路:用二维费用的背包+完全背包问题 (顺序循环)方法求解
什么是二维费用的背包问题?
问题:
二维费用的背包问题是指:对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。设这两种代价分别为代价1和代价2,第i件物品所需的两种代价分别为a[i]和b[i]。两种代价可付出的最大值(两种背包容量)分别为V和U。物品的价值为w[i]。
算法:
费用加了一维,只需状态也加一维即可。设f[i][v][u]表示前i件物品付出两种代价分别为v和u时可获得的最大价值。状态转移方程就是:
f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}
可以只使用二维的数组:
f[v][u]=max{f[v][u],f[v-a[i]][u-[b[i]]+w[i]}
本题中的两个代价?
1 忍耐度
2 杀死怪兽的个数
注意:代价不必用完,本题中容忍度不必用完,但是f[u][v]还是求的是最大值。
本题:
dp[i][j] = max (dp[i][j], dp[i - cos[f]][j - 1] + exp[f])
杀死第j个妖怪,在忍耐度为i的情况下,获得的最大经验值。
杀死第k种妖怪,得到经验值:exp,失去忍耐度,cos.
注意:
1 三个for循环都是顺循环(01背包第二个for是逆向循环),第二个for中要令int i = cos[f];不然结果回出错。
2 最后扫的时候 因为题目要求出剩余忍耐度最大,没有约束必须用完忍耐度,一旦找到经验加满的即为最优解;所以忍耐度从1到m遍历dp.
#include<stdio.h>
#include<string.h>
#define N 105
#define max(a,b) a>b?a:b
int main()
{//n,m,k,s(0 < n,m,k,s < 100)四个正整数。分别表示还需的经验值,保留的忍耐度,怪的种数和最多的杀怪数。
int n, m, k, s, dp[N][N], exp[N], cos[N];
while (scanf ("%d%d%d%d", &n, &m, &k, &s)!=EOF)
{
memset (dp, 0, sizeof (dp));
for (int i = 1; i <= k; ++i)
scanf ("%d%d", &exp[i], &cos[i]);
for (int f = 1; f <= k; f++)
for (int i = cos[f]; i <= m; ++i)
for (int j = 1; j <= s; ++j)
dp[i][j] = max (dp[i][j], dp[i - cos[f]][j - 1] + exp[f]);
int i;
for (i = 1; i <= m; ++i)
if (dp[i][s] >= n)
break;
if (i <= m) printf ("%d\n", m - i);
else printf ("-1\n");
}
}
2159 ACM 杭电 杀怪 二维费用的背包+完全背包问题的更多相关文章
- HDU 2159 二维费用背包问题
一个关于打怪升级的算法问题.. 题意:一个人在玩游戏老是要打怪升级,他愤怒了,现在,还差n经验升级,还有m的耐心度(为零就删游戏不玩了..),有m种怪,有一个最大的杀怪数s(杀超过m只也会删游戏的.. ...
- hdu2159二维费用背包
题目连接 背包九讲----二维费用背包 问题 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有一个可付出的最大值(背包容量).问怎样选择物 ...
- 动态规划:HDU2159-FATE(二维费用的背包问题)
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu_2159(二维费用背包)
HDU_2159 二维费用背包问题 http://acm.hdu.edu.cn/showproblem.php?pid=2159 #include<cstdio> #include< ...
- HDU 3496 (二维费用的01背包) Watch The Movie
多多想看N个动画片,她对这些动画片有不同喜欢程度,而且播放时长也不同 她的舅舅只能给她买其中M个(不多不少恰好M个),问在限定时间内观看动画片,她能得到的最大价值是多少 如果她不能在限定时间内看完买回 ...
- 洛谷 P1507 NASA的食物计划 【二维费用背包】 || 【DFS】
题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...
- Regionals 2014 >> Asia - Taichung 7003 - A Balance Game on Trees 树形DP + 二维费用背包
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 动态规划:HDU3496-Watch The Movie(二维费用的背包问题)
Watch The Movie Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- 洛谷 P1509 找啊找啊找GF(复习二维费用背包)
传送门 题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七夕这个日子,对于sq ...
随机推荐
- easyUI-datagrid带有工具栏和分页器的数据网格
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>数据 ...
- Python算法之二分查找法
1: l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 从列表中找到某个num的位置 def ...
- python-中缀转换后缀并计算
这个好像比较简单. 前缀规则好像还没有理清楚. # coding = utf-8 class Stack: def __init__(self): self.items = [] # 是否为空 def ...
- openCV 备忘
yum install python-devel numpy cmake gcc gcc-c++yum install gtk2-devel libdc1394-devel libv4l-devel ...
- noi.ac 第五场第六场
t1应该比较水所以我都没看 感觉从思路上来说都不难(比牛客网这可简单多了吧) 第五场 t2: 比较套路的dp f[i]表示考虑前i个数,第i个满足f[i]=i的最大个数 i能从j转移需要满足 j< ...
- 【Android】Android取消EditText自动获取焦点
解决方法: 在EditText的父级控件中找一个,设置成 android:focusable="true" android:focusableInTouchMode="t ...
- Flink--输入数据集Data Sources
flink在批处理中常见的source flink在批处理中常见的source主要有两大类. 1.基于本地集合的source(Collection-based-source) 2.基于文件的sourc ...
- FastJson 支持配置的PropertyNamingStrategy四种策略
摘要: FastJson默认使用CamelCase,在1.2.15版本之后,FastJson支持配置PropertyNamingStrategy,支持四种策略: CamelCase.PascalCas ...
- zTree实战
1.实体 public class UserDataZTreeVo { private String id; private String pid; private String name; priv ...
- Codeforces 877F Ann and Books 莫队
转换成前缀和, 预处理一下然后莫队. #include<bits/stdc++.h> #define LL long long #define fi first #define se se ...