UVA 565 - Pizza Anyone?

题目大意:你负责去订购一个大比萨, 但是你的朋友们对于要添加什么或者不添加什么都有不同的要求。 但是你的朋友们也知道不可能满足全部的要求。所以你要选择一个订购方案,让所有人至少满足其中一个要求。 注意,如果某人不想要哪个,那么不添加那个也算是满足了他的一个要求。


解题思路:题目只有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;
}


你可能感兴趣的:(UVA 565 - Pizza Anyone?)