HDU 3182 Hamburger Magi

阅读: 评论:0

HDU 3182 Hamburger Magi

HDU 3182 Hamburger Magi

题目:.php?pid=3182

题意:有n个汉堡,每个汉堡有一个价值和做汉堡需要的体力,并且做有些汉堡前需要先做别的汉堡,问最多能做出多大价值

 

每个汉堡只能做一次并且有先后顺序,所以需要状压dp而不能直接暴力判断

做汉堡的前置关系可以用状压来简化判断

还可以预处理出每个状态需要花费的体力

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
int n,m,maxx;
int cost[1<<15];
int a[20];
int dp[1<<15];
int v[20],e[20];
int main()
{ios::sync_with_stdio(false);int T;cin>>T;while(T--){cin>>n>>m;for(int i=0;i<n;i++)cin>>v[i];for(int i=0;i<n;i++)cin>>e[i];for(int i=0;i<n;i++){a[i]=0;int x,y;cin>>x;while(x--){cin>>y;y--;a[i]|=(1<<y);}}int tot=1<<n;memset(cost,0,sizeof(cost));for(int i=0;i<tot;i++){for(int j=0;j<n;j++)if ((i>>j)&1)cost[i]+=e[j];}memset(dp,-1,sizeof(dp));dp[0]=0;maxx=0;for(int i=0;i<tot;i++){if (dp[i]==-1) continue;for(int j=0;j<n;j++){if ((i>>j)&1) continue;if (cost[i]+e[j]>m) continue;if ((i&a[j])==a[j]){dp[i|(1<<j)]=dp[i]+v[j];maxx=max(maxx,dp[i|(1<<j)]);}}}cout<<maxx<<endl;}return 0;
}

  

转载于:.html

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

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

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

标签:HDU   Magi   Hamburger
留言与评论(共有 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