列表

详情


NC14699. 队伍配置

描述

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

输入描述

第1行输入三个整数n,m,d,代表玩家仓库的从者数量、概念礼装数量和cost上限值。
第2-n+1行,每行输入两个整数a1,b1,表示第i个从者的ATK值和cost值。
第n+2-n+m+1行,每行输入两个整数a2,b2,表示第i个概念礼装的ATK值和cost值。
数据保证:0<n,m≤300,25≤d≤138,1000≤a1≤15488,500≤a2≤2500,3≤b1,b2≤12

输出描述

输出一行,一个整数,代表可以凑出的最大ATK值。

示例1

输入:

4 2 25
2001 5
2002 5
2003 5
4010 10
2004 10
2005 10

输出:

10016

说明:

派上前4名从者,最大ATK值=2001+2002+2003+4010=10016(cost总值为25=玩家cost上限)

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 408K, 提交时间: 2022-08-24 08:36:22

#include<bits/stdc++.h>
using namespace std;
int n,m,d,atk,cost,f[10][200],ans;

int main()
{
	cin>>n>>m>>d;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&atk,&cost);
		for(int j=d;j>=cost;j--)
			for(int k=5;k>=1;k--)
				f[k][j]=max(f[k][j],f[k-1][j-cost]+atk);
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&atk,&cost);
		for(int j=d;j>=cost;j--)
			for(int k=0;k<=5;k++)
			{
				f[k][j]=max(f[k][j],f[k+1][j-cost]+atk);
				ans=max(f[k][j],ans);
			}
	}
	cout<<ans;
	return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 4ms, 内存消耗: 412K, 提交时间: 2023-01-15 00:24:25

#include<iostream>
using namespace std;
int f[607][10][10];
int main()
{
	int n,m,d,x,y,ans=-1;
	cin>>n>>m>>d;
	for(int i=1;i<=n;i++)
	{
		cin>>x>>y;
		for(int j=d;j>=y;j--)
			for(int k=1;k<=5;k++)
				ans=max(ans,f[j][k][0]=max(f[j][k][0],f[j-y][k-1][0]+x));
	}
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y;
		for(int j=d;j>=y;j--)
			for(int k=1;k<=5;k++)
				for(int l=1;l<=k;l++)
					ans=max(ans,f[j][k][l]=max(f[j][k][l],f[j-y][k][l-1]+x));
	}
	cout<<ans<<endl;
	return 0;
}

上一题