• 刷题记录:牛客NC14699队伍配置


    传送门:牛客

    题目描述:

    萌学姐在玩大型手游《futa go》,他现在准备进入作战环节,所以他准备安排自己的队伍。
    队伍配置里,可供玩家选择的作战人物被称作“从者”,玩家可以对每个“从者”可以装备至多1件的“概念礼装”,玩家具有一个cost上限值。详细定义如下:
    1、    每个从者和概念礼装都具有攻击值ATK。
    2、    每个从者和概念礼装都会占据一定的cost值。
    3、    每个从者和概念礼装只能上场一次,不能重复使用。
    4、    概念礼装只能装备在从者上,不能单独存在。
    5、    选择的从者和概念礼装的cost值之和不能超过玩家的cost上限值。
    6、    最多可以选择5名从者(在cost值限制下)。
    现在给出玩家仓库的每个从者和每件概念礼装的ATK值和cost值,问在满足定义的条件下,队伍可以凑出的最大ATK值。
    输入:
    4 2 25
    2001 5
    2002 5
    2003 5
    4010 10
    2004 10
    2005 10
    输出:
    10016
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    自我感觉比较难想的dp题,但是感觉掌握了套路之后又不是很难??dp题果然都是这样的,唉

    主要思路:

    1. 首先我们会发现这道题中的从者和礼装是交叉在一起的.同时从者的数量限定住了礼装的数量,所以我们肯定会有一种感觉我们需要记录每一个状态的从者的数量,不然的话礼装不好搞定.所以我们可以使用一个 d p [ j ] [ k ] [ k k ] dp[j][k][kk] dp[j][k][kk]数组;来记录 花费 j 个 c o s t 值选择 k 个从者 k k 个概念礼装的最大 A T K 值 花费j个cost值选择k个从者kk个概念礼装的最大ATK值 花费jcost值选择k个从者kk个概念礼装的最大ATK,然后我们就很容易得到一个转移方程了,这样的话我们就可以很容易的解决这个从者数量的问题了.然后我们将从者和礼装的问题分开来思考这样就变成了两个有限定条件的 01 背包 01背包 01背包,那么接下来我们只需要套模板就可以了

    转移方程:

    d p [ j ] [ k ] [ k k ] = m a x ( d p [ j ] [ k ] [ k k ] , d p [ j − c o s t ] [ k − 1 ] [ k k ] + A T K ) dp[j][k][kk]=max(dp[j][k][kk],dp[j-cost][k-1][kk]+ATK) dp[j][k][kk]=max(dp[j][k][kk],dp[jcost][k1][kk]+ATK)

    下面是具体的代码部分:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    typedef long long ll;
    #define inf 0x3f3f3f3f
    #define root 1,n,1
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    inline ll read() {
    	ll x=0,w=1;char ch=getchar();
    	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
    	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    	return x*w;
    }
    #define maxn 1000000
    #define ll_maxn 0x3f3f3f3f3f3f3f3f
    const double eps=1e-8;
    int n,m,d;
    ll dp[200][10][10];
    int main(){
    	n=read();m=read();d=read();
    	int a,b;ll ans=-inf;
    	for(int i=1;i<=n;i++) {
    		a=read();b=read();
    		for(int j=d;j>=b;j--) {
    			for(int k=1;k<=5;k++) {
    				dp[j][k][0]=max(dp[j][k][0],dp[j-b][k-1][0]+a);
    				ans=max(ans,dp[j][k][0]);
    			}
    		}
    	}
    	for(int i=1;i<=m;i++) {
    		a=read();b=read();
    		for(int j=d;j>=b;j--) {
    			for(int k=1;k<=5;k++) {
    				for(int kk=1;kk<=k;kk++) {
    					dp[j][k][kk]=max(dp[j][k][kk],dp[j-b][k][kk-1]+a);
    					ans=max(ans,dp[j][k][kk]);
    				}
    			}
    		}
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
  • 相关阅读:
    08-图8 How Long Does It Take
    linux centos安装nvm
    【乐吾乐3D可视化组态编辑器】3D场景与大屏通信
    在线文本数字识别列表求和工具
    数据结构之B树
    自然语言处理(NLP)—— Rasa中config.yml
    外包干了5天,技术退步明显.......
    什么是setInterval/setTimeout?
    mybatis-plus的插件
    高阶数据结构(1):并查集 与 图
  • 原文地址:https://blog.csdn.net/yingjiayu12/article/details/127649844