关注
#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。太爽了,自己想到的感觉是不一样
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
转发
点赞 评论 收藏
转发
牛客热帖
正在热议
# 牛客帮帮团来啦!有问必答 #
726608次浏览 11690人参与
# 海康威视求职进展汇总 #
91292次浏览 1091人参与
# 浅聊一下我实习的辛苦费 #
81428次浏览 761人参与
# 非技术岗是怎么找实习的 #
74526次浏览 1392人参与
# 如何写一份好简历 #
262554次浏览 3963人参与
# 硬件人求职现状 #
184607次浏览 2705人参与
# 通信硬件人笔面经互助 #
111231次浏览 2234人参与
# 机械制造面试记录 #
37557次浏览 505人参与
# 24届营销人拿到了几个offer #
4226次浏览 62人参与
# 铜五铁六真的存在吗? #
28175次浏览 298人参与
# 打工人的辛酸 #
8595次浏览 134人参与
# 实习生应该准时下班吗 #
76653次浏览 569人参与
# 美的求职进展汇总 #
38844次浏览 417人参与
# 产品实习,你更倾向大公司or小公司 #
36362次浏览 556人参与
# 数据人offer决赛圈怎么选 #
44729次浏览 727人参与
# 实习与准备秋招该如何平衡 #
171559次浏览 3105人参与
# 投了多少份简历才上岸 #
57344次浏览 951人参与
# 通信硬件薪资爆料 #
200155次浏览 1814人参与
# 面试中的破防瞬间 #
83368次浏览 1029人参与
# 找工作,你会甘心进小厂还是猛冲大厂 #
35572次浏览 355人参与