题目链接: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小时内删除。
留言与评论(共有 0 条评论) |