#include <cstdio>
#include <cstring>
using namespace std;
/*
题目大意:
有n头牛,m个谷仓,一个谷仓只能住一头牛,而且每头牛只住它喜欢的谷仓,
问你有几种满足的方案。
思路:
从初始态state = 0、第p = 0头牛开始,遍历每个谷仓,如果第i个谷仓没
有牛住(state >> i & 1 = 0),而且第p头牛喜欢这个谷仓G[p][i] = 1,
那么这头牛就住进这个谷仓,转移到下个状态state = state | (1 << i)、
第p + 1头牛。如果遍历到p = n,说明当前状态state可行,返回方案数1。
*/
const int N = 20, M = 1 << N;
int n, m;
int G[N + 5][N + 5];
int dp[M + 5];
int dps(int state, int p)
{
int &ans = dp[state];
if(ans >= 0) return ans;
if(p >= n) return ans = 1;
ans = 0;
for(int i = 0; i < m; i++)
{
if(G[p][i] && (state >> i & 1) == 0)
{
ans += dps(state | (1 << i), p + 1);
}
}
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
memset(dp, -1, sizeof(dp));
for(int i = 0; i < n; i++)
{
int t;
scanf("%d", &t);
while(t--)
{
int j;
scanf("%d", &j);
G[i][j - 1] = 1;
}
}
printf("%d\n", dps(0, 0));
return 0;
}
06-13
116
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交