Bowls and Dishes

该博客介绍了如何运用深度优先搜索(DFS)策略解决一个计算机科学竞赛中的问题。给定N个盘子和M个条件,只有当特定的盘子Ai和Bi上有球时,条件i才满足。有K个顾客会在指定的盘子上放置球。博客提供了输入输出样例及相应的C++代码实现,展示了如何通过DFS遍历所有可能的球放置情况,以找出最多能同时满足多少个条件。

来源:https://atcoder.jp/contests/abc190/tasks/abc190_c

一、题目

N个盘子,M个条件,当且仅当Ai和Bi盘子上有球时,条件i被满足。有K个顾客,每个顾客会在盘子Ci或者Di上放一个球。问最多有多少条件被满足?

二、输入

N M
A1 B1
.
.
.
AM BM
K
C1 D1
.
.
.
Ck Dk

三、输出

输出答案

四、样例

input:

4 4
1 2
1 3
2 4
3 4
3
1 2
1 3
2 3

output:

2

input:

4 4
1 2
1 3
2 4
3 4
4
3 4
1 2
2 4
2 4

output:

4

input:

6 12
2 3
4 6
1 2
4 5
2 6
1 5
4 5
1 3
1 2
2 6
2 3
2 5
5
3 5
1 4
2 6
4 6
5 6

output:

9

五、思路 + 代码

dfs

代码如下:

#include<iostream>
#include<map>
using namespace std;
int Max(int a, int b) {
	return a > b ? a : b;
}
int N, M, K;
int maxCdt;
int dishes[110];//有东西为1无为0
pair<int, int> cdt[110];//条件
pair<int, int> cstm[110];//顾客
//有多少满足条件
int check() {
	int cnt = 0;
	for (int i = 0; i < M; i++) {
		if (dishes[cdt[i].first] && dishes[cdt[i].second]) {
			cnt++;
		}
	}
	return cnt;
}
//第i个顾客
void dfs(int i) {
	if (i == K) {
		maxCdt = Max(maxCdt, check());
		return;
	}
	dishes[cstm[i].first]++;
	dfs(i + 1);
	dishes[cstm[i].first]--;

	dishes[cstm[i].second]++;
	dfs(i + 1);
	dishes[cstm[i].second]--;
}
int main() {
	cin >> N >> M;
	for (int i = 0; i < M; i++) {
		int a, b;
		cin >> a >> b;
		cdt[i] = make_pair(a, b);
	}
	cin >> K;
	for (int i = 0; i < K; i++) {
		int c, d;
		cin >> c >> d;
		cstm[i] = make_pair(c, d);
	}

	dfs(0);//从0号顾客开始dfs
	cout << maxCdt << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值