题目大意:你负责去订购一个大比萨, 但是你的朋友们对于要添加什么或者不添加什么都有不同的要求。 但是你的朋友们也知道不可能满足全部的要求。所以你要选择一个订购方案,让所有人至少满足其中一个要求。 注意,如果某人不想要哪个,那么不添加那个也算是满足了他的一个要求。
解题思路:题目只有16种东西选择, 对于每种东西之是选择或者不选泽两种状态。那么用暴力枚举法完全可以做出。
用一个数字,它的各个二进制位表示定或者不定。枚举0 ~ (1<<16)-1即可。
#include <cstdio> #include <cstring> int main() { char str[50]; while (scanf("%s", str) != EOF) { int n, status, num, person[100][2] = {0}, Max = (1 << 16) - 1; for (n = 0; str[0] != '.'; n++) { for (int i = 0; i < strlen(str) - 1; i += 2) person[n][str[i] == '+'] += 1 << str[i + 1] - 'A'; scanf("%s", str); } for (status = 0; status <= Max; status++) { for (num = 0; num < n; num++) if (!(status & person[num][1] || (status^Max) & person[num][0])) break; if (num == n) break; } if (status <= Max) { printf("Toppings: "); for (int i = 0; i <= 15; i++) if (status & (1 << i)) printf("%c", 'A' + i); printf("\n"); } else printf("No pizza can satisfy these requests.\n"); } return 0; }