HDU3182 Hamburger Magi【状压DP】

阅读: 评论:0

HDU3182 Hamburger Magi【状压DP】

HDU3182 Hamburger Magi【状压DP】

题目链接:Hamburger Magi

分析:每种汉堡只能做一次,恰好就是0~(1<<n)-1的所有状态;

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=(1<<15)+100;
int dp[maxn];
struct node{int val,cost,a;} p[20];
void rua()
{int n,m;scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%d",&p[i].val);for(int i=0;i<n;i++) scanf("%d",&p[i].cost);for(int i=0;i<n;i++){int kk;scanf("%d",&kk);p[i].a=0;while(kk--){int x;scanf("%d",&x);p[i].a|=(1<<(x-1));}}memset(dp,-1,sizeof(dp));dp[0]=0;for(int i=0;i<(1<<n);i++){if(dp[i]==-1) continue;int tot=0;for(int j=0;j<n;j++) if(i&(1<<j)) tot+=p[j].cost;if(tot>m) continue;for(int j=0;j<n;j++)if((i&(1<<j))==0 && (p[j].a&i)==p[j].a && tot+p[j].cost<=m) dp[i|(1<<j)]=max(dp[i|(1<<j)],dp[i]+p[j].val);}int ans=0;for (int i=0;i<(1<<n);i++) ans=max(ans,dp[i]);printf("%dn",ans);
}
int main()
{int t;scanf("%d",&t);while(t--) rua();return 0;
}

 

本文发布于:2024-02-03 02:06:13,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170689717147926.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:Hamburger   Magi   DP   状压
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23