
萌学姐在玩大型手游《futa go》,他现在准备进入作战环节,所以他准备安排自己的队伍。
队伍配置里,可供玩家选择的作战人物被称作“从者”,玩家可以对每个“从者”可以装备至多1件的“概念礼装”,玩家具有一个cost上限值。详细定义如下:
1、 每个从者和概念礼装都具有攻击值ATK。
2、 每个从者和概念礼装都会占据一定的cost值。
3、 每个从者和概念礼装只能上场一次,不能重复使用。
4、 概念礼装只能装备在从者上,不能单独存在。
5、 选择的从者和概念礼装的cost值之和不能超过玩家的cost上限值。
6、 最多可以选择5名从者(在cost值限制下)。
现在给出玩家仓库的每个从者和每件概念礼装的ATK值和cost值,问在满足定义的条件下,队伍可以凑出的最大ATK值。
题目
- 原题地址:队伍配置
- 题目编号:NC14699
- 题目类型:DP、二位费用背包
- 时间限制:C/C++ 1秒,其他语言2秒
- 空间限制:C/C++ 32768K,其他语言65536K
1.题目大意
- 我,有
cost值,我要选人(不超过5个),每个人都有cost值和ATK值,每个人都要选至多1件装备
- 每件装备都有
cost值和ATK值,要保证我的cost值要大于选中的每个人的cost值和装备的cost值之和
- 求
ATK最大值
![]()
2.题目分析
- dp[i][j][k]表示cost为i时,选了j个从者,k个概念礼装的最大ATK
3.题目代码
#include <bits/stdc++.h>
#define f(i,j,k) for(int i=j;i>=k;i--)
#define ff(i,k) for(int i=1;i<=k;i++)
using namespace std;
int n, m, d, a, b, c[302][6][6], ans;
int main() {
cin >> n >> m >> d;
ff(i,n){
cin >> a >> b;
f(j,d,b)ff(k,5) ans = max(ans,(c[j][k][0]=max(c[j][k][0],c[j-b][k-1][0]+a)));
} ff(i,m){
cin >> a >> b;
f(j,d,b)ff(k,5)ff(l,k)ans = max(ans,(c[j][k][l]=max(c[j][k][l],c[j-b][k][l-1]+a)));
} cout << ans << endl;
}