大家好,我是小码匠,今天继续分享的是一道非常简单状压DP的题目。
离自己的既定目标:
官方原题:
Geppetto 开了一家披萨店,他正在努力做出全市最好的披萨。
Geppetto 用 N 种原材料做比萨,每种原材料只有一个。原材料标号为 1 到 N。做披萨很简单,只要把原材料混合好然后放进烤箱里烤一烤就行了。但 Geppetto 发现一共有 M 对原材料是冲突的,如果一对冲突的原材料混合在一份披萨里,这份披萨就会变得十分难吃。这给他带来了额外的麻烦。
Geppetto 想知道他最多能做多少种不同的比萨。如果一份比萨上有编号为 i 的原材料,而另一份比萨上没有,那么这两份比萨就是不同的。
第一行两个整数 N,M,分别表示原材料总数和冲突总数。
接下来 M 行,每行两个整数
,表示一对冲突中两种原材料的编号。
一行一个整数,表示 Geppetto 最多能做多少种披萨。
输入 #1复制
3 2
1 2
2 3
输出 #1复制
5
输入 #2复制
3 0
输出 #2复制
8
输入 #3复制
3 3
1 2
1 3
2 3
输出 #3复制
4
【样例 1 解释】
Geppetto 可以做出以下 4
种披萨:
1
2
3
1 3
不过因为 Geppetto 可以不放原材料,所以最多可以做出 5
种披萨。
【样例 2 解释】
没有原材料冲突,所以一共可以做出
=8 种披萨。
【样例 3 解释】
由于所有原材料都互相冲突,所以 Geppetto 只能放一种原材料或者不放原材料,一共可以做出 1+3=4 种披萨。
【数据范围】
对于 100% 的数据,1≤N≤20,0≤M≤400,
,保证
#include <bits/stdc++.h>
using namespace std;
struct node {
int x, y;
} a[405];
void best_coder() {
int n, m;
int ans = 0;
cin >> n >> m;
for (int i = 0; i < m; ++i) {
cin >> a[i].x >> a[i].y;
}
for (int i = 0; i < (1 << n); ++i) {
bool is = false;
for (int j = 0; j < m; ++j)
if (i & (1 << (a[j].x - 1)) && i & (1 << (a[j].y - 1))) {
is = true;
break;
}
if (!is) {
++ans;
}
}
cout << ans;
}
void happy_coder() {
}
int main() {
// 提升cin、cout效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// 小码匠
best_coder();
// 最优解
// happy_coder();
return 0;
}