题目链接: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的更多相关文章

  1. 二维背包(钟神想要的)(不是DP)

    [问题描述] 背包是个好东西,希望我也有.给你一个二维的背包,它的体积是? × ?.现在你有一些大小为1× 2和1×3的物品,每个物品有自己的价值.你希望往背包里面装一些物品,使得它们的价值和最大,问 ...

  2. hdu 4501 小明系列故事——买年货_二维背包

    题目:你可以有v1元,v2代金券,v3个物品免单,现在有n个商品,商品能用纸币或者代金券购买,当然你可以买v3个商品免费.问怎么最大能买多少价值 题意: 思路二维背包,dp[v1][v2][v3]=M ...

  3. HDU 2159 FATE (二维背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 解题报告:这题实际上是一个二维的背包问题,也可以由01背包扩展而来,01背包用一维数组,可想而知 ...

  4. rqnoj-329-刘翔!加油!-二维背包

    注意排除干扰项. 因为价值不会相等,所以价值的多少与本题没有任何关系,. 所以价值为干扰项,所以不用考虑. 二维背包,简单求解. #include<stdio.h> #include< ...

  5. NOI 4978 宠物小精灵之收服(二维背包)

    http://noi.openjudge.cn/ch0206/4978/ 描述 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事. 一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物 ...

  6. dp之二维背包poj2576

    题意:有一群sb要拔河,把这群sb分为两拨,两拨sb数只差不能大于1,输出这两拨人的体重,小的在前面...... 思路:把总人数除2,总重量除2,之后你会发现就是个简单的二维背包,有两个限制..... ...

  7. hdu 3496 Watch The Movie (二维背包)

    Watch The Movie Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)T ...

  8. 二维背包---P1509 找啊找啊找GF

    P1509 找啊找啊找GF 题解 很明显这是一道二维背包题目 如果一个dp数组做不了,那么我们就再来一个dp数组 题目要求,花费不超过 m ,消耗人品不超过  r  ,泡到尽量多的妹子,时间尽量少 f ...

  9. 二维背包---P1855 榨取kkksc03

    P1855 榨取kkksc03 题解 二维背包板子题 f[ i ][ j ] 前 n 个物品,花费金钱不超过 i ,花费时间不超过 j 的最大价值 如果每个物品只能选一次,那么就相当于在01背包上多加 ...

随机推荐

  1. windows系统安装

    系统最新地址:https://www.microsoft.com/zh-cn/software-download/windows10

  2. leetcode1008

    class Solution: def __init__(self): self.root = None def construct(self,order,root,i): if i==len(ord ...

  3. NRF51822之使用外部32Mhz晶振

    硬件平台为微雪BLE400的(将原来的16mhz晶振改为32mhz.两个旁电容改为22pf) 以nRF51_SDK_10.0.0_dc26b5e\examples\ble_peripheral\ble ...

  4. django form 的内置字段类型

    定义的form类如下: from django import forms from django.forms import widgets class AddHouseForm(forms.Form) ...

  5. 机器学习进阶-目标跟踪-KCF目标跟踪方法 1.cv2.multiTracker_create(构造选框集合) 2. cv2.TrackerKCF_create(获得KCF追踪器) 3. cv2.resize(变化图像大小) 4.cv2.selectROI(在图像上框出选框)

    1. tracker = cv2.multiTracker_create() 获得追踪的初始化结果 2.cv2.TrackerKCF_create() 获得KCF追踪器 3.cv2.resize(fr ...

  6. spark使用scala读取Avro数据(转)

    这是一篇翻译,原文来自:How to load some Avro data into Spark. 首先,为什么使用 Avro ? 最基本的格式是 CSV ,其廉价并且不需要顶一个一个 schema ...

  7. Servlet基本_クッキー、URLリライティング

    1.クッキーの基礎クッキーは.クライアント側に保存されるテキストデータです. セキュリティ上の制約.・自分で発行したクッキーにしかアクセスできない.クッキーには発行元のホストの情報が記録されている.・ ...

  8. Python开发环境搭建指导

    本文主要介绍Python开发环境的搭建.主要包括如下几部分内容: (1)Python软件的安装.注意版本的选择和安装过程中选项的勾选. (2)pip工具环境变量.镜像源的配置使用和常用镜像源介绍.pi ...

  9. centos6.5下oracle自动备份删除指定天数的文件

    第一步先做一个备份 #!/bin/sh export ORACLE_BASE=/home/oracle/app export ORACLE_HOME=/dbhome_1 export ORACLE_S ...

  10. 实例的render方法渲染组件

    1.普通渲染组件 在app容器中插入login组件 <login></login>  一个app可以多个这种组件 <script> var login = { te ...