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 ... 
随机推荐
- Vue-cli 创建的项目配置跨域请求(通过反向代理)---配置多个代理--axios请求
			问题描述: 使用 Vue-cli 创建的项目,开发地址是 localhost:8080,需要访问 localhost:9000 或https://m.maoyan.com或http://image.b ... 
- requests中get和post传参
			get请求 get(url, params=None, **kwargs) requests实现get请求传参的两种方式 方式一: import requests url = 'http://www. ... 
- ajax对象方法的使用
			change.js文件的内容对象函数关键字:fnjQuery.fn.change = function () { this.css({"background": "red ... 
- gitlab的完全卸载
			一:先停止gitlab gitlab-ctl stop 二:卸载gitlab部分(之前我是rpm安装的,这里rpm卸载) rpm -e gitlab-ce 三:发现系统进程还有一个gitlab的进 ... 
- C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号
			class Program { static void Main(string[] args) { Log("测试"); Console.Read(); } public stat ... 
- Linux CA证书与https讲解
			1.什么是CA证书. ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有人都不认识他,他咋办捏?常用的办法是带公司开的一张介绍信,在 ... 
- web列表总结
			ztree:web树 下拉列表树: jqxgrid列表(带有多选,单选.搜索.分页.分页多选.还有点击下拉等功能) 还有flexigrid(百度搜索) 
- python--smtp邮件使用
			#构建对象时,第一个是邮件正文,第二个发送类型,plain表示纯文本,最后使用utf-8保证多语言兼容 #如果需要发送html的话,就把plain改为html------>内容使用html构造便 ... 
- 将程序sublime添加到右键菜单中
			新建wangzhaobo.bat复制一下代码, 粘贴保存,然后打开. @echo Off :START CLS echo *====================================== ... 
- Java03动手动脑
			1.当JAVA里定义的函数中去掉static后,怎么办? static代表静态,由于main函数是静态的,如果自己定义的函数方法加了static则在类加载时就一起加载了.但如果不写static,就必须 ... 
