牛客 每日一题 队伍配置 dp

这是一道关于队伍配置的题目,给定n个人和m件装备,每个人最多选一件装备,总花费不超过d,目标是求最大贡献。题目限制n, m <= 300,d <= 128。解题思路涉及01背包,但博主表示在状态转移方面遇到困难。" 7920694,1285575,iOS移动端获取ArcGIS Server服务列表教程,"['GIS开发', 'iOS开发', 'Web服务', 'REST API']
摘要由CSDN通过智能技术生成

队伍配置

题目链接

题意

给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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值