传送门
其实这道题也比较简单,第一次做也没有思路。
dp[i][j][k]表示在cost=i时候,选j个从者,k个概念礼装的最大atk值。
#include <iostream>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <deque>
#include <cstdlib>
#define lowbit(x) ((x) & -(x))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
const int maxn = 1e7 + 7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
using namespace std;
const ll mod = 1e9 + 7;
const double pi = acos(-1.0);
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if (ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x * f;
}
int a1[maxn], a2[maxn], b1[maxn], b2[maxn];
int dp[210][10][10];
int main(){
ios::sync_with_stdio(false);
// freopen("text.txt","r",stdin);
// freopen("out1.txt","w",stdout);
int n, m, d;
cin >> n >> m >> d;
int ans = 0;
memset(dp,0,sizeof(dp));
for (int i = 0; i < n; i ++){
cin >> a1[i] >> b1[i];
for (int j = d; j >= b1[i]; j --){
for (int k = 1; k <= 5; k ++){
dp[j][k][0] = max(dp[j][k][0],dp[j-b1[i]][k-1][0] + a1[i]);
ans = max(ans,dp[j][k][0]);
}
}
}
for (int i = 0; i < m; i ++){
cin >> a2[i] >> b2[i];
for (int j = d; j >= b2[i]; j --){
for (int k = 1; k <= 5; k ++){
for (int l = 1; l <= k; l ++){
dp[j][k][l] = max(dp[j][k][l],dp[j-b2[i]][k][l-1] + a2[i]);
ans = max(ans,dp[j][k][l]);
}
}
}
}
cout << ans << endl;
return 0;
}