0
点赞
收藏
分享

微信扫一扫

P2430 严酷的训练

Ichjns 2022-03-12 阅读 22

传送门

思路:求最大奖励值就可以转换成费用为 p[ i ].a,价值为 p[ i ].b ,求最大价值的问题。这道题就转化成了在一定大小的背包内(即规定时间内)可以装下的最大价值的物品, 变成一道01背包的问题。
  WKY花费时间的倍数×老王做题时间 = WKY做题用时。

accode:

#include <bits/stdc++.h>
using namespace std;
#define max(a,b) (a)>(b) ? (a) : (b);
typedef long long ll;
const int maxn = 5010;
int dp[maxn];
int v[maxn], w[maxn];

struct node{
	int a, b;
}p[maxn];

int main()
{
	memset(dp, 0, sizeof(dp));
	int l, ll, n, m, c;
	scanf("%d %d", &l, &ll);
	l = ll / l;//此时l代表水平倍数 
	scanf("%d %d", &m, &n);//总题数和知识点个数 
	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &c);
		v[i] = c * l;
	}//v[i]为每道题WKY所需时间 
	
	for(int i = 1; i <= m; i++)
	{
		scanf("%d %d", &p[i].a , &p[i].b );//输入每题的知识点和对应奖励
		
		for(int j = 1; j <= n; j++)
		{
			if(p[i].a  == j){
				p[i].a = v[j];//转换为存每题的所需时间
				j = n + 1;	
			}
		}
		//cout<<"p[i].a  p[i].b  "<<p[i].a <<" "<<p[i].b <<endl;
	}
	int t;
	scanf("%d", &t);
	for(int i = 1; i <= m; i++)
	{
		for(int j = t; j >= p[i].a ; j--)
		{
			dp[j] = max(dp[j], dp[j - p[i].a ] + p[i].b );
		}
	}
	cout<<dp[t]<<endl;
	
	return 0;
}
举报

相关推荐

0 条评论