搜索水题。。。。。。。
没加剪枝都过了(才不是我不知道要加什么剪枝)
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; vector<int>g[20]; int s[20],t[20],cnt[20],r[20],p[20]; int ans,n,m; void dfs(int i,int j,int d){ if(i>n){ int tmp=0; for(int k=1;k<=m;k++) if(cnt[k]==p[k])tmp+=r[k]; ans=max(ans,tmp); }else if(j==g[i].size())dfs(i+1,0,1); else{ dfs(i,j+1,d); if(d<=s[g[i][j]]&&cnt[g[i][j]]!=p[g[i][j]]){ cnt[g[i][j]]++; dfs(i,j+1,t[g[i][j]]+1); cnt[g[i][j]]--; } } } bool cmp(int i,int j){ if(s[i]==s[j])return t[i]<t[j]; return s[i]<s[j]; } int main(){ //freopen("a.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int k;scanf("%d",&k); while(k--){ int x;scanf("%d",&x); g[i].push_back(x); } } for(int i=1;i<=m;i++) scanf("%d%d%d%d",&s[i],&t[i],&p[i],&r[i]); for(int i=1;i<=n;i++)sort(g[i].begin(),g[i].end(),cmp); dfs(1,0,1); printf("%d\n",ans); return 0; }