洛咕 P3961 [TJOI2013]黄金矿工

甚至都不是树形背包= =

把每条线抠出来,这一条线就是个链的依赖关系,随便背包一下

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return x*f;
}
struct yyb{int x,y,t,v;}s[210];
il bool operator <(const yyb&a,const yyb&b){return a.y<b.y;}
std::map<std::pair<int,int>,int>M;
int cnt;
std::vector<yyb>S[210];
int f[40010];
int main(){
#ifndef ONLINE_JUDGE
    freopen("3961.in","r",stdin);
    freopen("3961.out","w",stdout);
#endif
    int n=gi(),t=gi();
    for(int i=1;i<=n;++i){
        s[i].x=gi(),s[i].y=gi(),s[i].t=gi(),s[i].v=gi();
        int g=std::__gcd(s[i].x,s[i].y);
        std::pair<int,int>pr=std::make_pair(s[i].x/g,s[i].y/g);
        if(M.find(pr)==M.end())M[pr]=++cnt;
        S[M[pr]].push_back(s[i]);
    }
    for(int i=1;i<=cnt;++i){
        std::sort(S[i].begin(),S[i].end());
        for(int p=t;p;--p){
            int sumt=0,sumv=0;
            for(int j=0;j<S[i].size();++j){
                sumt+=S[i][j].t,sumv+=S[i][j].v;
                if(sumt>p)break;
                f[p]=std::max(f[p],f[p-sumt]+sumv);
            }
        }
    }
    printf("%d\n",f[t]);
    return 0;
}
posted @ 2018-10-21 22:21  菜狗xzz  阅读(235)  评论(0编辑  收藏  举报