codeforces 864E Fire (排序+背包dp)

来源:互联网 发布:gmip源码分析 编辑:程序博客网 时间:2024/05/21 22:49

题目大意:
现在你有n个物品,每个物品三个属性,我个人记为a,b,c.
a表示你需要花a的时间去救这个物品,b表示到b时间后物品就销毁了,c表示救这个物品的价值,求出能救到的最大价值。
n <= 100 b <= 2000 c <= 20 a <= 20

排序后dp,要先救活时间短的,所以就是从小到大排序

#include <bits/stdc++.h>using namespace std;struct node{    int t,d,p,id;}s[110];int dp[2010];vector<int> v[2010];int cmp(node a,node b){    return a.d<b.d;}int main(){    int n;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d%d%d",&s[i].t,&s[i].d,&s[i].p),s[i].id=i;    }    sort(s+1,s+n+1,cmp);    for(int i=1;i<=n;i++)    {        if(s[i].d-s[i].t<=0) continue;        for(int j=s[i].d-1;j-s[i].t>=0;j--)        {            if(dp[j]<dp[j-s[i].t]+s[i].p)            {                dp[j]=dp[j-s[i].t]+s[i].p;                v[j]=v[j-s[i].t];                v[j].push_back(s[i].id);            }        }    }    int best=0,bestI=0;    for(int i=0;i<=2000;i++)    {        if(dp[i]>best)        {            best=dp[i];            bestI=i;        }    }    printf("%d\n",best );    printf("%d\n",v[bestI].size() );    for(int i=0;i<v[bestI].size();i++)        printf("%d ",v[bestI][i] );}
原创粉丝点击