HDU 3182【状压DP--easy】

来源:互联网 发布:java源代码分享 编辑:程序博客网 时间:2024/05/16 11:58

挺简单的。。然而还是想了一会。。。感觉自己脑袋还不是很清醒。。TAT。。。自己脑袋里老是有些奇奇怪怪的小细节。。TAT

#include <stdio.h>#include <iostream>#include <string.h>using namespace std;#define maxn 40000class node{public:    int cost,sum;}dp[maxn];class nodee{public:    int v,e,need;}a[16];int bina[16],n,total;int vis[maxn];void init(){    for(int i=0;i<16;i++)        bina[i]=1<<i;}int max(int x,int y){return x>y?x:y;}void work(){    memset(vis,0,sizeof(vis));    int maxnum=1<<n;    dp[0].cost=0,dp[0].sum=0;    vis[0]=1;    for(int j=0;j<maxnum;j++)    {        for(int i=0;i<n;i++)        {            if(!vis[j]) continue;            if((j&bina[i])==0)            {                int now=j|bina[i];                if((j&a[i].need)==a[i].need)                {                    if(vis[now])                    {                        if(a[i].e+dp[j].cost<=total)                        {                            if(dp[now].sum<dp[j].sum+a[i].v)                            dp[now].sum=dp[j].sum+a[i].v;                            else if(dp[now].sum==dp[j].sum+a[i].v)                                if(a[i].e+dp[j].cost<dp[now].cost)                                    dp[now].cost=a[i].e+dp[j].cost;                        }                    }                    else                    if(a[i].e+dp[j].cost<=total)                    {                        dp[now].sum=dp[j].sum+a[i].v;                        dp[now].cost=dp[j].cost+a[i].e;                        vis[now]=1;                    }                }            }        }    }    int ans=0;    for(int i=0;i<maxnum;i++)        if(vis[i]) ans=max(ans,dp[i].sum);    cout<<ans<<endl;}int main(){    int T;    cin>>T;    init();    while(T--)    {        cin>>n>>total;        for(int i=0;i<n;i++)        {            cin>>a[i].v;        }        for(int i=0;i<n;i++)        {            cin>>a[i].e;        }        for(int i=0;i<n;i++)        {            int m,tmp=0,x;            cin>>m;            for(int j=0;j<m;j++)            {                cin>>x;                tmp+=bina[--x];            }            a[i].need=tmp;        }        work();    }    return 0;}


0 0
原创粉丝点击