3130 CYD刷题

题目描述 Description

下午,CYD要刷题了,已知CYD有N题可刷,但他只有M分钟的时间,而且他的智慧值为Q,也就是说他只能做出难度小于等于Q的题目。已知每题可得积分Ai,需花费时间Bi,难度为Ci,问CYD最多可得多少积分。

输入描述 Input Description

N  M  Q

Ai Bi Ci

输出描述 Output Description

可得最多积分

样例输入 Sample Input

4  20  10

20 3 7

30 7 9

30 1 11

20 17 6

样例输出 Sample Output

50


和一般的0,1背包一样。这里多了一个“智商”,当智商不足时候,dp[i][j] = dp[i-1][j]。


#include <iostream>
#include <vector>
using namespace std;
int M,N,Q;
int a,b,c;
int dp[51][501];   // N 到题,M分钟,Q智慧可以得到的最大分数。
vector<int> va,vb,vc; // 得分,花费时间,难度
int main()
{
	cin >> N >> M >> Q;
	for (int i = 1; i <= N; i++)
	{
		cin >> a >> b >> c;
		va.push_back(a);
		vb.push_back(b);
		vc.push_back(c);
	}
	for (int i = 1; i <= N; i++)
	{
		for (int i1 = 0; i1 < vb[i-1]; i1++)
		{
			dp[i][i1] = dp[i-1][i1];
		}
		for (int k = M; k >= vb[i-1]; k--)
		{
			if(Q > vc[i-1])
			{
				dp[i][k] = max(dp[i-1][k],dp[i-1][k-vb[i-1]]+va[i-1]);
			}
			else
			{
				dp[i][k] = dp[i-1][k];
			}
		}

	}
	cout<<dp[N][M];
	return 0;
}


你可能感兴趣的:(3130 CYD刷题)