题目意思: 有16种甜品,现在要做一个批萨,有很多人,每个人喜欢的甜品各不相同,要求我们找到一个方案使得至少让每个人都能够满足一个要求,最后输出这个方案。
解题思路: 我么知道对于每一个toppings只有两种情况取和不取,那么最多有16种,2^16是很小的,那么我们便可以枚举每一个情况,然后去判断是否每个人都能够满足,加入能够满足直接输出即可。注意这一题的输出是多种情况,不一定和样列相同。时间可能会很慢,还有注意数组的大小
代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <list>
using namespace std;
const int MAXN = 100;
char G[MAXN][40]; //存储输入的字符串(注意数组的大小)
int P[16]; //存储每一个状态
int m, ans, len, flag;
//处理问题的函数
void solve(int cnt) {
int i, j;
int pos = 15;
memset(P, -1, sizeof (P)); //初始化为-1
while (pos >= 0) {
P[pos] = cnt & 1;
pos--;
cnt >>= 1;
}
//搜索只要每个人都满足即可判断这种情况就是满足的解
for (i = 0; i < len; i++) {
flag = 0;
for (j = 0; G[i][j] != ';'; j++) {
if (G[i][j] == '+') {
j++;
int t = G[i][j] - 65;
if (P[t])
flag = 1;
}
if (G[i][j] == '-') {
j++;
int t = G[i][j] - 65;
if (P[t] == 0)
flag = 1;
}
}
if (flag == 0)//如果有一个不满足直接退出
return;
}
if (i == len)
ans = 1;
}
//输出函数
void output() {
if (ans) {
printf("Toppings: ");
for (int i = 0; i < 16; i++) {
if (P[i])
printf("%c", i + 65);
}
printf("\n");
} else
printf("No pizza can satisfy these requests.\n");
}
//主函数
int main() {
int i;
while (gets(G[0]) && strcmp(G[0], ".")) {
i = 1;
ans = 0;
while (gets(G[i])) {
if (strcmp(G[i], ".") == 0)
break;
i++;
}
len = i;
m = 65535;//2的16次方减1
while (m) {//枚举每一种情况
solve(m);
if (ans)//找到以后退出不用继续搜索
break;
m--;
}
output();
}
return 0;
}