#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f3f3f const int N=1<<16; #define ll long long int a[20],dp[N],v[N]; int dfs(int st,int now) {     if(~dp[st])return dp[st];     int ans=0;     for(int s=st; s; s=(s-1)&st)         if(v[s])ans=max(dfs(st-s,now+v[s])+a[now+v[s]],ans);     return dp[st]=ans; } int main() {     int n,m,s=0;     cin>>n>>m;     for(int i=0; i<n; i++)         cin>>a[i],s+=a[i];     sort(a,a+n,greater<int>());     for(int i=0; i<m; i++)     {         int x,y;         cin>>x;         int st=0;         for(int j=0; j<x; j++)         {             cin>>y;             y--;             st|=(1<<y);         }         v[st]=x;     }     memset(dp,-1,sizeof dp);     s-=dfs((1<<n)-1,-1);     cout<<s<<endl; } 一开始想通过m个状态来组合出最优的,想到m^2都不能跑就觉得好难。后来经过提示复杂度O(3^n)后,才想到枚举子集的子集。反过来确定是否有m。太爽了,自己想到的感觉是不一样
点赞 评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:55
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 12:20
点赞 评论 收藏
分享
06-15 20:57
已编辑
门头沟学院 Java
CARLJOSEPH...:年轻人有傲气很正常,但是建议工作前洗净傲气。 说实在的,什么奖学金什么奖项的都很一般。尊重你的老师,在有时间的时候去上课,真遇到走不开的事,请态度端正地向你的老师说明情况,请求请假。我相信任何一个有师德的老师都会允许的(我的老师就是这样)。
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务