传送门
思路:求最大奖励值就可以转换成费用为 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;
}