目录
I love exam HDU - 6968
题意:
有n个考试科目,现在有m套复习资料,每套复习资料需要花费wi天使用,用完提升ci的分数,
现在还有t天复习时间,挂科数目不能超过p,问所有达到的最大分数
思路:
首先01背包求出每门课花费k天可以最多得到多少分,然后dp[i][k][l]前i门课程,复习了k天,
挂了l门课程的最大分数。
dp[i][k][l]=max(dp[i-1][k-j][l-x]+f[j],dp[i][k][l]);
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long LL;
typedef pair<int,int> PII;
#define re register
const int inf=0x3f3f3f3f;
const double PI = acos(-1);
const int N=101010;
const int mod=1e9+7;
int n,m;
map<string,int>mp;
string s;
int f[3000],dp[60][3000][15];
struct node
{
int x,y;
};
vector<node>vec[500];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
string s;
for(int i=1; i<=n; i++)
{
cin>>s;
mp[s]=i;
}
scanf("%d",&m);
for(int i=0; i<m; i++)
{
string s;
int x,y;
cin>>s>>x>>y;
int id=mp[s];
vec[id].push_back(node{x,y});
}
int d,p;
scanf("%d %d",&d,&p);
memset(dp,-0x3f,sizeof(dp));
dp[0][0][0]=0;
for(int i=1; i<=n; i++)
{
memset(f,-inf,sizeof f);
f[0]=0;
for(int j=0; j<vec[i].size(); j++)
{
for(int k=d; k>=vec[i][j].y; k--)
{
f[k]=max(f[k],f[k-vec[i][j].y]+vec[i][j].x);
}
}//01背包求出每门课花费k天可以最多得到多少分。
for(int j=1;j<=d;j++)
{
for(int k=j;k<=d;k++)
{
for(int l=0;l<=p;l++)
{
if(f[j]<0) continue;
bool x=0;
if(f[j]<60) x=1;
if(f[j]>100) f[j]=100;
if(l>=x)
{
dp[i][k][l]=max(dp[i-1][k-j][l-x]+f[j],dp[i][k][l]);//前i门课程,复习了k天,挂了l门课程的最大分数。
}
}
}
}
}
int mx=-inf;
for(int i=0;i<=d;i++)
{
for(int j=0;j<=p;j++)
{
mx=max(mx,dp[n][i][j]);
}
}
if(mx<0) cout<<"-1"<<endl;
else cout<<mx<<endl;
mp.clear();
for(int i=1;i<=n;i++)
{
vec[i].clear();
}
}
return 0;
}