题意:给定n个从者,m个概念礼装,然后每个从者,概念礼装都有一定的ATK值和所需要的cost值,然后现在玩家的cost值上线为d,并且选择的从者数大于等于概念礼装数,从者数要小于5个
题解:01背包加强版
建立图片说明 数组,表示消耗cost值为i,获得j个从者,和k个概念礼装得到的ATK值
因为输入的时候先输入从者的数据,所以先计算dp[i][k][0]
所以对于计算从者的时候有:图片说明
现在有一个增加x的ATK值,以及消耗y的cost值得从者
消耗cost的j值获得k个从者与消耗j-y的cost值获得k-1个从者加上当前的从者的ATK值比较大小
同理,接下来计算能有多少的概念礼装:图片说明
然后再对于每一种情况进行比较,取最大值
时间复杂度:图片说明

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int f[200][10][10];
int ans=0;
int main()
{
    int n,m,d;
    cin>>n>>m>>d;
    for (int i=0; i<n; i++)
    {
        int x,y;
        cin>>x>>y;
        for (int j=d; j>=y; j--)
        {
            for (int k=1; k<=5; k++)
            {
                f[j][k][0]=max(f[j][k][0],f[j-y][k-1][0]+x);
                ans=max(ans,f[j][k][0]);
            }
        }
    }
    for (int i=0; i<m; i++)
    {
        int x,y;
        cin>>x>>y;
        for (int j=d; j>=y; j--)
        {
            for (int k=1; k<=5; k++)
            {
                for (int p=1; p<=k; p++)
                {
                    f[j][k][p]=max(f[j][k][p],f[j-y][k][p-1]+x);
                    ans=max(ans,f[j][k][p]);
                }
            }
        }
    }
    cout<<ans<<endl;
}