題目:製作一個披薩,有幾個小夥伴他們都有喜歡喝不喜歡的材料列表,
製作一個披薩讓所有的人條件都至少滿足一個。
分析:搜索,狀態壓縮。一共65536種狀態直接利用二進制枚舉所有狀態,判斷是否滿足即可。
說明:還差兩道╮(╯▽╰)╭。
#include <cstdlib>
#include <cstring>
#include <cstdio>
char buf[13][40];
int satisfy[13];
int main()
{
while (~scanf("%s",buf[0])) {
int count = 0;
while (buf[count][0] != '.') {
count ++;
scanf("%s",buf[count]);
}
int find = 0;
for (int p = 0; p < 65536; ++ p) {// 2^16 = 65536
find = 1;
for (int i = 0; i < count; ++ i) {
satisfy[i] = 0;
for (int j = 1; buf[i][j]; j += 2) {
int bits = 1<<(buf[i][j]-'A');
if (buf[i][j-1] == '+' && (bits&p) != 0) {
satisfy[i] = 1;
break;
}
if (buf[i][j-1] == '-' && (bits&p) == 0) {
satisfy[i] = 1;
break;
}
}
if (satisfy[i] == 0) {
find = 0;
break;
}
}
if (find) {
find = 1;
printf("Toppings: ");
int place = 0;
while ((1<<place) <= p) {
if ((1<<place)&p) {
printf("%c",'A'+place);
}
place ++;
}
puts("");
break;
}
}
if (!find) {
puts("No pizza can satisfy these requests.");
}
}
return 0;
}