hdu4571 背包

来源:互联网 发布:金税通网络电子发票 编辑:程序博客网 时间:2024/05/01 22:50

先对景点排序,然后按顺序背包,对初始结束节点特殊处理一下。


ACcode:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int NS=210;const int INF=10000;struct node{    int id,c,va;    bool operator < (const node cmp) const{        return va<cmp.va;    }}s[NS];int g[NS][NS],c[NS],top;int dp[NS][330],f[NS];int Max(int a1,int b1){    return a1>b1?a1:b1;}int Min(int a1,int b1){    return a1<b1?a1:b1;}int main(){    int W,cas=0;    scanf("%d",&W);    int x,y,z,w;    int a,b,d,n,m,t,st,ed;    while (W--)    {        scanf("%d%d%d%d%d",&n,&m,&t,&st,&ed);        for (int i=0;i<n;i++)        scanf("%d",&s[i].c),s[i].id=i;        for (int i=0;i<n;i++)        scanf("%d",&s[i].va);        for (int i=0;i<n;i++)        {            for (int j=0;j<n;j++)            g[i][j]=INF;            g[i][i]=0;        }        for (int i=0;i<m;i++)        {            scanf("%d%d%d",&a,&b,&d);            g[a][b]=g[b][a]=Min(g[a][b],d);        }        for (int k=0;k<n;k++)        for (int i=0;i<n;i++)        for (int j=0;j<n;j++)        g[i][j]=Min(g[i][j],g[i][k]+g[k][j]);        sort(s,s+n),top=0;        memset(dp,-1,sizeof(dp));        for (int i=0;i<n;i++)        {            x=s[i].id,w=s[i].va;            z=g[st][x]+s[i].c;            dp[x][z]=w;            for (int j=0;j<top;j++)            {                if (w<=f[j]) break;                y=c[j],z=s[i].c+g[x][y];                for (int k=t-z;k>=0;k--)                {                    if (dp[y][k]<0) continue;                    dp[x][k+z]=Max(dp[x][k+z],dp[y][k]+w);                }            }            f[top]=w;            c[top++]=x;        }        for (int j=0;j<n;j++)        for (int k=t;k>=0;k--)        if (k>=g[j][ed]) dp[j][k]=dp[j][k-g[j][ed]];        else dp[j][k]=-1;        x=0;        for (int i=0;i<n;i++)        for (int j=0;j<=t;j++)        {            x=Max(x,dp[i][j]);        }        printf("Case #%d:\n",++cas);        printf("%d\n",x);    }    return 0;}


原创粉丝点击