2017年10月8日提高组T1 didi
Description
Input
Output
分析:一看就是dp,排序之后做一次01背包就好了,按b[i]/c[i]从大到小排序。
代码
#include <cstdio>
#include <algorithm>
#define maxn 6000
using namespace std;
struct arr
{
int a,b,c;
double q;
}s[maxn];
int f[maxn],n,t;
int so(arr u,arr v)
{
return u.q>v.q;
}
int fmax(int x,int y)
{
if (x>y) return x;
return y;
}
int main()
{
//freopen("didi.in","r",stdin);
//freopen("didi.out","w",stdout);
int T;
scanf("%d",&T);
for (int l=1;l<=T;l++)
{
scanf("%d%d",&n,&t);
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&s[i].a,&s[i].b,&s[i].c);
s[i].q=s[i].b*1.0/s[i].c*1.0;
}
sort(s+1,s+n+1,so);
for (int i=1;i<=n;i++)
for (int j=t;j>=s[i].c;j--)
f[j]=fmax(f[j],f[j-s[i].c]-s[i].b*j+s[i].a);
int ans=0;
for (int i=1;i<=t;i++)
if (f[i]>ans) ans=f[i];
printf("%d\n",ans);
for (int i=1;i<=t;i++)
f[i]=0;
}
fclose(stdin);
fclose(stdout);
}