题解 | #队伍配置#

队伍配置

https://ac.nowcoder.com/acm/problem/14699

本题从者和装备都只能使用一次,证明是一个01背包问题。但是条件中对于装备又受从者的限制,从者也最多只能有5个。除此之外还有cost值的限制。再加上每一个装备或者从者本身都就有4个东西需要去维护了。而对于装备或者从者本身可以使用滚动数组的方式不需要去创建一个数组维度。
那么本题中装备的维度必须在从者之后,因为能够装多少件装备是由从者去决定的,对于cost值来说放前放后到时都行。
在这里dp[i][j][k]。其中i表示cost值,j表示从者数量,k表示装备数量。总体代表在在这些条件下的最大ATK值。
那么在某个cost下装备的数值其实取决于从者的数值,所以先计算出从者的最大ATK值,然后根据这个花费下的从者的最大ATK值得到装备k件装备的最大ATK值。
最后再遍历一遍求最大值即可。
#include <bits/stdc++.h>

using namespace std;
int n, m, d;
int dp[138+2][300+2][300+2];

int main() {
    int x, y;
    cin>>n>>m>>d;
    for (int k=1;k<=n;k++) {
        cin>>x>>y;
        for (int i=d;i>=y;i--) {
            for (int j=1;j<=5;j++) {
                dp[i][j][0] = max(dp[i][j][0], dp[i-y][j-1][0]+x);
            }
        }
    }
    while (m--) {
        cin>>x>>y;
        for (int i=d;i>=y;i--) {
            for (int j=1;j<=5;j++) {
                for (int k=1;k<=j;k++) {
                    dp[i][j][k] = max(dp[i][j][k], dp[i-y][j][k-1]+x);
                }
            }
        }
    }
    int ans=-1;
    for( int i=0;i<=d;i++ )
    for( int j=0;j<=5;j++ )
    for( int k=0;k<=5;k++ ) ans=max(ans,dp[i][j][k]);
    printf("%d\n",ans);
    return 0;
}


全部评论
你这个代码有问题,假如队员选不够下标的数字的情况呢,比如说cost值为1,从者的限制值最低也有2,也就是一个从者都选不了,这个时候服装的限制值最高为1,也就是说任意一个服装都能选,但是因为从者一个都没有选,所以服装就选不了,这个时候你的代码就不正确了,你的代码会出现光选服装不选从者的情况
1 回复 分享
发布于 05-16 23:49 广西

相关推荐

不愿透露姓名的神秘牛友
07-11 11:21
被夸真的超级开心,好可爱的姐姐
码农索隆:老色批们不用脑补了,我把金智妮的图找来了查看图片
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 12:20
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务