SSL2764 2017年10月8日提高组T1 didi(dp)

来源:互联网 发布:python win32api 截屏 编辑:程序博客网 时间:2024/05/06 11:23

2017年10月8日提高组T1 didi

Description
这里写图片描述
Input
这里写图片描述

Output
这里写图片描述

分析:一看就是dp,排序之后做一次01背包就好了,按b[i]/c[i]从大到小排序。

代码

#include <cstdio>#include <algorithm>#define maxn 6000using 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);}