[P1064]金明的预算方案

来源:互联网 发布:java优势在哪里 编辑:程序博客网 时间:2024/04/30 04:17

原题链接

本来是道DP题,我们拿来练搜索了(:зゝ∠)虽然最后还是写了DP

一开始的时候把每个情况都单独拿出来了变成01背包
但是有可能出现[选了主件A][选了主件A和附件a1]同时被选中的情况
这样当然就不符合题意了呀☆
因为每个主件顶多只有两个附件所以可以枚举情况直接变成分组背包
每组里面只能选一个

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<string>#include<queue>#include<vector>using namespace std;struct nico{    int fv[5],fc[5];    int d=0;}g[500],k[500];int n,m,v,p,q,i,j,t,f,rom[400000],p1,l;int main(){    scanf("%d%d",&n,&m);    for(i=1;i<=m;i++)    {        scanf("%d%d%d",&v,&p,&q);        if(q!=0)         {            g[q].d++;            g[q].fv[g[q].d]=v;            g[q].fc[g[q].d]=v*p;        }        else        {            g[i].fv[0]=v;            g[i].fc[0]=v*p;        }    }    for(i=1;i<=m;i++)        if(g[i].fc[0]!=0)        {            f++;            t=1;            k[f].fv[1]=g[i].fv[0];            k[f].fc[1]=g[i].fc[0];            for(j=1;j<=g[i].d;j++)            {                if(j==1)                 {                    t++;                    k[f].fc[t]=g[i].fc[0]+g[i].fc[1];                    k[f].fv[t]=g[i].fv[0]+g[i].fv[1];                                       }                if(j==2)                {                    t++;                    k[f].fc[t]=g[i].fc[0]+g[i].fc[2];                    k[f].fv[t]=g[i].fv[0]+g[i].fv[2];                    t++;                    k[f].fc[t]=g[i].fc[0]+g[i].fc[1]+g[i].fc[2];                    k[f].fv[t]=g[i].fv[0]+g[i].fv[1]+g[i].fv[2];                    }            }            k[f].d=t;        }    for(i=1;i<=f;i++)        for(j=n;j>=0;j--)            for(l=1;l<=k[i].d;l++)                if(j>=k[i].fv[l]) rom[j]=max(rom[j],rom[j-k[i].fv[l]]+k[i].fc[l]);                  printf("%d",rom[n]);    return 0;}
0 0
原创粉丝点击