二维背包 hdu2159
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159
题目里面有两个限制条件,忍耐度和杀怪数量,所以可以用一个二维数组dp[i][j]来表示在消耗忍耐度i,并且杀怪数量为j时可以得到的最大经验,也可以用三维数组,但是因为每次的答案值依赖前一次的值,所以可以省略一维直接用二维数组。
第一次做这种类型没想到用二维数组,开了两个一维数组做,现在有点觉得这个维数是不是就是限制条件的数量,我们用每一维的数组下标来表示每一种限制条件,那以后如果遇到三个限制条件,多个限制条件,那么是不是应该就是开多维数组来进行计算,感觉又更懂了那么一点点。
我看博客之后的代码和第一次写的代码:
看了博客之后:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 105
/*struct point{
int u,w;
};
bool operator <(const point &s1,const point &s2)
{
if(s1.w!=s2.w)
return s1.w>s2.w;
else
return s1.u>s2.u;
}*/
int dp[maxn][maxn];//dp[i][j]表示忍耐度消耗i,杀死怪物数量为j时可以获得的最大经验
int v[maxn],w[maxn];
int n,m,k,t,s;
int main()
{
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
for(int i=;i<=k;i++)
scanf("%d%d",&v[i],&w[i]);
memset(dp,,sizeof(dp));
int ans=-;
for(int i=;i<=m;i++)//忍耐度,第一个限制条件,这三个循环可以互换位置,但是因为题目要我们求
{ //最后剩余的最大忍耐值,所以忍耐度放在第一层循环应该更快一点,可以跳出
for(int j=;j<=s;j++)//杀怪数量,第二个限制条件
{
for(int e=;e<=k;e++)//怪物种类
{
if(i>=w[e])
dp[i][j]=max(dp[i][j],dp[i-w[e]][j-]+v[e]);
}
if(dp[i][j]>=n)
{
ans=i;
break;
}
}
if(ans!=-)
break;
}
if(ans!=-)
printf("%d\n",m-ans);
else
printf("%d\n",ans);
}
return ;
}
开了两个一维数组的代码(经过讨论,下面代码是错的,但是偏偏过了,所以应该是后台数据有问题):
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 105
/*struct point{
int u,w;
};
bool operator <(const point &s1,const point &s2)
{
if(s1.w!=s2.w)
return s1.w>s2.w;
else
return s1.u>s2.u;
}*/
int n,m,k,s,t;
int v[maxn],w[maxn],dp[maxn],num[maxn];
int main()
{
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
for(int i=;i<=k;i++)
scanf("%d%d",&v[i],&w[i]);
memset(dp,,sizeof(dp));//dp[i]表示消耗忍耐度i时可以得到的最大经验值
memset(num,,sizeof(num));//记录杀怪数量,两个数组同步
for(int i=;i<=k;i++)
{
for(int j=w[i];j<=m;j++)
{
if(num[j-w[i]]+<=s&&(dp[j]<dp[j-w[i]]+v[i]||dp[j]==dp[j-w[i]]+v[i]&&num[j]>num[j-w[i]]+))
{//经验值放在第一位,然后杀怪数量第二位,但是前提是不能超出s
dp[j]=dp[j-w[i]]+v[i];
num[j]=num[j-w[i]]+;
}
}
}
int ans=-;
for(int i=;i<=m;i++)//找满足条件并且消耗最小忍耐度的结果
{
if(dp[i]>=n)
{
ans=m-i;
break;
}
}
printf("%d\n",ans);
}
return ;
}
二维背包 hdu2159的更多相关文章
- 二维背包(钟神想要的)(不是DP)
[问题描述] 背包是个好东西,希望我也有.给你一个二维的背包,它的体积是? × ?.现在你有一些大小为1× 2和1×3的物品,每个物品有自己的价值.你希望往背包里面装一些物品,使得它们的价值和最大,问 ...
- hdu 4501 小明系列故事——买年货_二维背包
题目:你可以有v1元,v2代金券,v3个物品免单,现在有n个商品,商品能用纸币或者代金券购买,当然你可以买v3个商品免费.问怎么最大能买多少价值 题意: 思路二维背包,dp[v1][v2][v3]=M ...
- HDU 2159 FATE (二维背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 解题报告:这题实际上是一个二维的背包问题,也可以由01背包扩展而来,01背包用一维数组,可想而知 ...
- rqnoj-329-刘翔!加油!-二维背包
注意排除干扰项. 因为价值不会相等,所以价值的多少与本题没有任何关系,. 所以价值为干扰项,所以不用考虑. 二维背包,简单求解. #include<stdio.h> #include< ...
- NOI 4978 宠物小精灵之收服(二维背包)
http://noi.openjudge.cn/ch0206/4978/ 描述 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事. 一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物 ...
- dp之二维背包poj2576
题意:有一群sb要拔河,把这群sb分为两拨,两拨sb数只差不能大于1,输出这两拨人的体重,小的在前面...... 思路:把总人数除2,总重量除2,之后你会发现就是个简单的二维背包,有两个限制..... ...
- hdu 3496 Watch The Movie (二维背包)
Watch The Movie Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)T ...
- 二维背包---P1509 找啊找啊找GF
P1509 找啊找啊找GF 题解 很明显这是一道二维背包题目 如果一个dp数组做不了,那么我们就再来一个dp数组 题目要求,花费不超过 m ,消耗人品不超过 r ,泡到尽量多的妹子,时间尽量少 f ...
- 二维背包---P1855 榨取kkksc03
P1855 榨取kkksc03 题解 二维背包板子题 f[ i ][ j ] 前 n 个物品,花费金钱不超过 i ,花费时间不超过 j 的最大价值 如果每个物品只能选一次,那么就相当于在01背包上多加 ...
随机推荐
- 四、Java web 部 分试题
1 .Tomcat 的 优 化 经 验 答:去掉对 web.xml 的监视,把 jsp 提前编辑成 Servlet. 有富余物理内存的情况,加大 tomcat 使用的 jvm 的内存 2 .HTTP ...
- ThinkCentre进入BIOS,设置intel virtualization technology
VMware安装提示cpu虚拟化intel virtualization technology ThinkCentre重启长按F1 按enter,开启intel virtualization tech ...
- ThinkPHP3.2项目模块结构
Demo --项目目录 Addons --插件目录 Application --应用模块目录 Admin --后台模块 Common --后台公共函数目录 function.php (可选) Conf ...
- CKEditor 5
1.官网 https://ckeditor.com/ckeditor-5/download/ 2.
- C# 调用win32 DLL报错 System.BadImageFormatException
C# 调用win32 DLL报错 System.BadImageFormatException 项目右键属性->项目设计器->生成->平台->把'默认设置(任何 CPU)'改 ...
- 爬虫--Scrapy-持久化存储操作2
1.管道的高级操作 将爬取到的数据值分别存储到本地磁盘.redis数据库.mysql数据. 需求:将爬取到的数据值分别存储到本地磁盘.redis数据库.mysql数据. 1.需要在管道文件中编写对应平 ...
- EF 配置MySQL
添加 mysql dll 引用 WebConfig 配置: 1.先添加connectionstrings,providerName 换成 mysql的 <connectionStrings> ...
- AJax知识介绍
参考:http://www.runoob.com/ajax/ajax-asp-php.html
- linux查询硬件信息
硬件信息查询 sudo dmidecode -t baseboard
- javascript:控制一个元素高度始终等于浏览器高度
window.onresize = function(){ this.opHtight()} //给浏览器添加窗口大小改变事件window.onresize = function(){ this.op ...