队伍配置
题意
给n个人,每个人有花费和贡献
m个装备,每个装备也有花费和贡献。
每个人最多只能够有一件装备。每个装备只能给一个人。
最多可以选5个人。
选出来的人和装备的花费和不能超过d。
求可以选出来的最大的贡献和是多少。
总结:三个条件:
选的装备的数量不能多余人的数量。
花费不能多余d
最多选5个人。
数据范围:
n,m <= 300
d <= 128
题解。
肯定可以想得到背包。但是我还是不会,我好菜。
dp[i][j][k] 表示花费为i的时候选j个人和k件装备的最大的贡献是多少。
这个表达的状态我是想到了,但是不会转移。。
怎么转移呢?
可以先算出不要装备的时候的贡献。
然后把装备加进去。
不加装备这个就是01背包了。
for (int i = 1; i <= n; i ++ )
{
for(int j = d; j >= a[i].sd; j -- )
{
for (int k = 1; k <= 5; k ++ )
{
dp[j][k][0] = max(dp[j - a[i].sd][k - 1][0] + a[i].st,dp[j][k][0]);
ans = max(ans,dp[j][k][0]);
// printf("%d %d %d\n",j,k,dp[j][k][0]);
}
}
}
然后 把装备加进去。
for (int i = 1; i <= m; i ++ )
{
for (int j = d; j >= b[i].sd; j -- )
{
for (int k = 1; k <= 5; k ++ )
{
for (int p = 1; p <= k