其他分享
首页 > 其他分享> > 石油大 Contest1777 - 2019年第二阶段我要变强个人训练赛第九场 J 流浪西邮之寻找火石碎片(背包)

石油大 Contest1777 - 2019年第二阶段我要变强个人训练赛第九场 J 流浪西邮之寻找火石碎片(背包)

作者:互联网

时间限制: 1 Sec  内存限制: 128 MB
提交: 81  解决: 28
[提交] [状态] [命题人:admin]

题目描述

众所周知,由于木星引力的影响,世界各地的推进发动机都需要进行重启。现在你接到紧急任务,要去收集火石碎片,重启西邮发动机。现在火石碎片已成为了稀缺资源,获得火石碎片需要钱或者需要一定的积分。火石碎片有大有小,越大的碎片能量越大,火石碎片的能量越大,重启的发动机的推力也就越强。但是,不只有我们在努力呀,隔壁的师大和政法也都在收集碎片,争取重启师大发动机和政法发动机,哪个高校重启的发动机推力最大,就能代表长安区大学城为世界做出贡献,从而在史书上留下浓墨重彩的一笔。
现在你有v1块钱,v2积分,能免费(免积分)收集k个火石碎片,现在总共有n个火石碎片,每个碎片需要的钱a或者积分b,碎片的能量为val。我们希望收集火石碎片,使能量的总和尽可能大,问你skyer_hxx最多可以拿到能量总和的最大值是多少?

 

输入

输入包含多组测试用例。
每组数据的第一行是四个整数n,v1,v2,k;
然后是n行,每行三个整数a,b,val,分别表示每个碎片的价钱,兑换所需积分,所含能量。
1≤n≤100
0≤v1,v2≤100
0≤k≤5
0≤a,b,val≤100

 

输出

对于每组数据,输出能得到的最大能量值。 

 

样例输入

4 5 2 1
2 2 4
4 5 1
4 2 4
2 2 5

样例输出

14

昨晚被C题那个越界的地方整懵逼了,不过,即使有时间,我也不会这道题,我dp本身就弱的一批,加上也没做过多少题,还有时间,多做做!这题一看数据就应该知道是dp了,再看看就知道是背包,关键是怎么个背包法。如果把问题分解,那就是三个背包,一个是花积分的背包,一个是花钱的背包,一个是花免费次数的背包。直接三维背包,搞一搞就行了。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 110;
int dp[N][N][10];
int a[N],b[N],val[N];
int n,v1,v2,k;
void Init()
{
	for(int i=0;i<=v1;i++)
		for(int j=0;j<=v2;j++)
			for(int kk=0;kk<=k;kk++)
				dp[i][j][kk]=0;
	return ;
}
int main(void)
{
	
	while(~scanf("%d%d%d%d",&n,&v1,&v2,&k))
	{
		Init();
		for(int i=1;i<=n;i++)
			scanf("%d%d%d",&a[i],&b[i],&val[i]);
		
		for(int i=1;i<=n;i++)
		{
			for(int j=v1;j>=0;j--)
			{
				for(int y=v2;y>=0;y--)
				{
					for(int x=k;x>=0;x--)
					{
						//花免费次数 
						if(x>=1) dp[j][y][x]=max(dp[j][y][x],dp[j][y][x-1]+val[i]);
						//花钱 
						if(j>=a[i]) dp[j][y][x]=max(dp[j][y][x],dp[j-a[i]][y][x]+val[i]);
						//花积分 
						if(y>=b[i]) dp[j][y][x]=max(dp[j][y][x],dp[j][y-b[i]][x]+val[i]);
					}
				}
			}
		}
		printf("%d\n",dp[v1][v2][k]);		
		
	}
	
	return 0;
} 

 

 

标签:火石,val,int,Contest1777,碎片,我要,西邮,v2,dp
来源: https://blog.csdn.net/birdmanqin/article/details/94379410