选书
题目描述
学校放寒假时,信息学奥赛辅导老师有1,2,3……x本书,要分给参加培训的x个人,每人只能选一本书,但是每人有两本喜欢的书。老师事先让每个人将自己喜欢的书填写在一张表上。然后根据他们填写的表来分配书本,希望设计一个程序帮助老师求出所有可能的分配方案,使每个学生都满意。
输入格式
第1行:一个数x
第2行~第1+x行:每行两个数,表示ai喜欢的书的序号
输出格式
只有一个数:总方案数total。
样例 #1
样例输入 #1
5
1 3
4 5
2 5
1 4
3 5
样例输出 #1
2
提示
所有数据:x<=20
(世界上最难出数据的题目,没有之一……)
update 2022/03/07,阮行止
本题原始数据中,最后一个数据点的 x 为 0
,期望输出为 0
。考虑到这个数据不合理,予以删去。现在提交这个题目不会遇到 x=0 的数据点。
思考:
比较基础的搜索题
一个人一个人的搜索
每一个人就两种情况:选第一本书或者选第二本书
选书的时候标记一下已选
然后回溯一下即可
终止条件:当前人数>n
复杂度 O ( 2 n ) O(2^n) O(2n)
#include<bits/stdc++.h>
using namespace std;
int n;
struct Node{
int a,b;
}a[101100];
bool f[10100];
int Ans = 0;
void Dfs(int now){
if (now > n) {Ans++;return;}
if (!f[a[now].a]) f[a[now].a] = 1, Dfs(now+1),f[a[now].a] = 0;
if (!f[a[now].b]) f[a[now].b] = 1, Dfs(now+1),f[a[now].b] = 0;
}
int main(){
scanf("%d",&n);
for (int i = 1; i <= n; i++) scanf("%d %d",&a[i].a,&a[i].b);
Dfs(1);
printf("%d",Ans);
}