队伍配置(dp)

队伍配置

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

题意:略。

题记:每一个从者和礼装都当成是一个物品,那么物品只有选和不选两种情况。(背包的思想)

dp[i][j][k][l]表示前i个物品cost值为j选了k个从者和l件礼装。

在循环时可以把数组第一维优化掉(跟背包问题一样优化)。

在输入从者时:
dp[j][k][0]=max(dp[j][k][0],dp[j-y][k-1][0]+x);

在输入从者时:
dp[j][k][l]=max(dp[j][k][l],dp[j-y][k][l-1]+x);

在每次计算时用ans去取最大值即是答案。

#include<bits/stdc++.h>

using namespace std;
int dp[200][10][10];
int main(){
    int n,m,d;
    cin>>n>>m>>d;
    int x,y,ans=0;
    for(int i=1;i<=n;i++){
        cin>>x>>y;
        for(int j=d;j>=y;j--){//枚举cost值
            for(int k=1;k<=5;k++){//枚举从者
                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--){//枚举cost值
            for(int k=1;k<=5;k++){//枚举从者
                for(int l=1;l<=k;l++){//枚举礼装
                    dp[j][k][l]=max(dp[j][k][l],dp[j-y][k][l-1]+x);
                    ans=max(ans,dp[j][k][l]);
                }
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
全部评论
感觉有些东西没有考虑到 1 2 25 2001 5 2004 10 2005 10 这个样例是错的
点赞
送花
回复
分享
发布于 2022-10-21 17:20 新加坡

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务