BZOJ 1198: [HNOI2006]军机调度(搜索)
直接暴搜就行了= =
CODE:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int count(int x) {
int ans=0;
while (x) {
ans+=x&1;
x>>=1;
}
return ans;
}
#define maxn 35
int b[maxn],e[maxn],r[maxn],ans,n,m,p[maxn],s[maxn];
bool a[maxn][maxn],is[maxn][maxn];
int dfs(int x,int sum) {
if (sum>ans) ans=sum;
if (x==m+1) return 0;
dfs(x+1,sum);
int tot=0,s[maxn];
for (int i=1;i<=n;i++)
if (a[i][x]) {
bool flag=1;
for (int j=b[x];j<=e[x];j++)
if (is[i][j]) {flag=0;break;}
if (flag) s[++tot]=i;
}
if (tot<p[x]) return 0;
for (int i=1;i<(1<<tot);i++) {
if (count(i)!=p[x]) continue;
for (int j=1;j<=tot;j++) {
if ((1<<(j-1))&i){
int y=s[j];
for (int k=b[x];k<=e[x];k++) is[y][k]=1;
}
}
dfs(x+1,sum+r[x]);
for (int j=1;j<=tot;j++) {
if ((1<<(j-1))&i){
int y=s[j];
for (int k=b[x];k<=e[x];k++) {is[y][k]=0;}
}
}
}
return 0;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) {
int x;
scanf("%d",&x);
for (int j=1;j<=x;j++) {
int y;
scanf("%d",&y);
a[i][y]=1;
}
}
for (int i=1;i<=m;i++) {
scanf("%d%d%d%d",b+i,e+i,p+i,r+i);
}
dfs(1,0);
printf("%d",ans);
return 0;
}