队伍配置
队伍配置
https://ac.nowcoder.com/acm/problem/14699
题意
有个从者,
个装备,最多选择
个从者,每个从者只能装备一个装备,可以不装,从者和装备都会消耗
获得相应的
,问不超过
的
可以获得的最大
是多少?
分析
显然装备装在任何人身上都是等价的,所以我们可以先考虑从者,再考虑装备。
定义为选了
个从者,
件装备,消耗体积
所获得的最大
。
我们可以先不考虑装备,处理出所有的情况。
然后我们再枚举装备数量。
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define int long long
const int inf = 0x3f3f3f3f;
const int maxn = 310;
const int M = 1e9+7;
int n,m,d;
struct node
{
int x,y;
}a[maxn],b[maxn];
int dp[6][6][150];
signed main()
{
cin>>n>>m>>d;
for(int i = 1; i <= n; i++)
{
cin>>a[i].x>>a[i].y;
}
for(int i = 1; i <= m; i++)
{
cin>>b[i].x>>b[i].y;
}
for(int i = 1; i <= n; i++)
{
for(int j = d; j >= a[i].y; j--)
{
for(int k = 5;k >= 1; k--)
{
dp[k][0][j] = max(dp[k][0][j],dp[k-1][0][j-a[i].y]+a[i].x);
}
}
}
for(int i = 1; i <= m; i++)
{
for(int j = d; j >= b[i].y; j--) //枚举体积
{
for(int k = 5; k >= 1; k--) //枚举从者数量
{
for(int l = k; l >= 1; l--) //枚举装备数量
{
dp[k][l][j] = max(dp[k][l][j],dp[k][l-1][j-b[i].y]+b[i].x);
}
}
}
}
int ans = 0;
for(int i = 1; i <= 5; i++)
{
for(int j = 0; j <= i; j++)
{
for(int k = 0; k <= d; k++)
{
ans = max(ans,dp[i][j][k]);
}
}
}
cout<<ans<<endl;
return 0;
}
查看11道真题和解析