• 找到最高ATK要满足以下条件:
  1. cost不能超过上限
  2. 概念礼装数量不能超过从者
  3. 从者最多5个
  • 我们可以用一个dp数组将这些条件全部包揽
  1. dp[i][j][k]表示cost为i时,选了j个从者,k个概念礼装的最大ATK值
  2. 因为概念礼装依附从者,所以先转移从者
  3. 先假设k=0的时候进行转移,最多五个从者,j最大为5,用01背包更新完所有k=0的状态。dp[j][k][0]=max(dp[j][k][0],dp[j-y][k-1][0]+x);这个是不使用概念礼装,获得k个从者时,能够得到的最大ATK
  4. 更新完之后,我们就要更新k的状态了, 并且要保证的是k更新的时候需要小于等于当前的从者数进行更新dp[j][k][kk]=max(dp[j][k][kk],dp[j-y][k][kk-1]+x),然后就可以得到最大ATK
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[300][20][20];
//建立dp[i][j][k]数组,表示消耗cost值为i,获得j个从者,和k个概念礼装得到的ATK值
int n,m,d,ans=0;
int x,y;
signed main()
{
	cin>>n>>m>>d;
	for(int i=1;i<=n;i++)
	{
		cin>>x>>y;//第i个从者的ATK值和cost值。
		for(int j=d;j>=y;j--)
		{
			for(int k=1;k<=5;k++)
			{
//概念礼装为0,我们比较当前状态下获得从者的攻击值 x 和之前状态获得的攻击值
//dp[j][k][0]表示在消耗cost值为j,获得k个从者,并且不使用概念礼装时的最大ATK值。
//dp[j-y][k-1][0]表示在消耗cost值为j-y,获得k-1个从者,并且不使用概念礼装时的最大ATK值。
//为了找到在不使用概念礼装的情况下,获得k个从者时,能够达到的最大ATK值。 
				dp[j][k][0]=max(dp[j][k][0],dp[j-y][k-1][0]+x);
				ans=max(ans,dp[j][k][0]);
			}
		}
	}
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y;
		for(int j=d;j>=y;j--)
		{
			for(int k=1;k<=5;k++)
			{
				for(int kk=1;kk<=k;kk++)
				{
//比较当前状态下获得概念礼装的攻击值 x 和之前状态获得的攻击值,取较大的值作为当前状态的最大攻击值 
//dp[j][k][kk]表示在消耗cost值为j,获得k个从者,并且使用kk个概念礼装时的最大ATK值。
//dp[j-y][k][kk-1]表示在消耗cost值为j-y,获得k个从者,并且使用kk-1个概念礼装时的最大ATK值。
//了找到在使用kk个概念礼装的情况下,获得k个从者时,能够达到的最大ATK值。
					dp[j][k][kk]=max(dp[j][k][kk],dp[j-y][k][kk-1]+x);
					ans=max(ans,dp[j][k][kk]);
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
 }