传送门:牛客
题目描述:
萌学姐在玩大型手游《futa go》,他现在准备进入作战环节,所以他准备安排自己的队伍。
队伍配置里,可供玩家选择的作战人物被称作“从者”,玩家可以对每个“从者”可以装备至多1件的“概念礼装”,玩家具有一个cost上限值。详细定义如下:
1、 每个从者和概念礼装都具有攻击值ATK。
2、 每个从者和概念礼装都会占据一定的cost值。
3、 每个从者和概念礼装只能上场一次,不能重复使用。
4、 概念礼装只能装备在从者上,不能单独存在。
5、 选择的从者和概念礼装的cost值之和不能超过玩家的cost上限值。
6、 最多可以选择5名从者(在cost值限制下)。
现在给出玩家仓库的每个从者和每件概念礼装的ATK值和cost值,问在满足定义的条件下,队伍可以凑出的最大ATK值。
输入:
4 2 25
2001 5
2002 5
2003 5
4010 10
2004 10
2005 10
输出:
10016
自我感觉比较难想的dp题,但是感觉掌握了套路之后又不是很难??dp题果然都是这样的,唉
主要思路:
转移方程:
下面是具体的代码部分:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
ll x=0,w=1;char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*w;
}
#define maxn 1000000
#define ll_maxn 0x3f3f3f3f3f3f3f3f
const double eps=1e-8;
int n,m,d;
ll dp[200][10][10];
int main(){
n=read();m=read();d=read();
int a,b;ll ans=-inf;
for(int i=1;i<=n;i++) {
a=read();b=read();
for(int j=d;j>=b;j--) {
for(int k=1;k<=5;k++) {
dp[j][k][0]=max(dp[j][k][0],dp[j-b][k-1][0]+a);
ans=max(ans,dp[j][k][0]);
}
}
}
for(int i=1;i<=m;i++) {
a=read();b=read();
for(int j=d;j>=b;j--) {
for(int k=1;k<=5;k++) {
for(int kk=1;kk<=k;kk++) {
dp[j][k][kk]=max(dp[j][k][kk],dp[j-b][k][kk-1]+a);
ans=max(ans,dp[j][k][kk]);
}
}
}
}
cout<<ans<<endl;
return 0;
}