委派任务问题
1.问题描述
某项任务需要在A、B、C、D、E、F这6个人中挑选人来完成,但挑选人受限于以下的条件:
(1) A和B两个人至少去一人;
(2) A和D不能同时去;
(3) A、E和F三人中要挑选两个人去;
(4) B和C同时去或者都不去;
(5) C和D两人中只能去一个;
(6) 如果D不去,那么E也不去。
试编程求出应该让哪几个人去完成这项任务。
2.问题分析
把六个条件转换成表达式,假设参加任务为1,不参加为0,那么这几个条件分别是
A+B>=1
A+D!=2
A+E+F==2
B+C==0||B+C=2
C+D==1
D+E==0||D++1
3.算法设计
穷举法算出所有的情况,然后用逻辑表达式作为判断条件,如果符合,输出结果
if (A + B >= 1 && A + D != 2 && A + E + F == 2 && (B + C == 0 || B + C == 2) && C + D == 1 && (D + E == 1 || D == 1))
输出结果会用到三目运算符,表达式格式为:<表达式1> ? <表达式2> : <表达式3>;
(1)计算表达式1的值;
(2) 若表达式1的值为真(或非0),则只计算表达式2,将其结果作为整个表达式的值;
若表达式1的值为假(或为0),则只计算表达式3,将其结果作为整个表达式的值。
就是这样
cout << "A " << (A ? "" : "不") << "去。" << endl;
4.完整程序
#include<iostream> using namespace std; int main() { int A, B, C, D, E, F;//下面是穷举法,穷举出所有可能的情况 for (A = 0; A <= 1; A++) { for (B = 0; B <= 1; B++) { for (C = 0; C <= 1; C++) { for (D = 0; D <= 1; D++) { for (E = 0; E <= 1; E++) { for (F = 0; F <= 1; F++) { if (A + B >= 1 && A + D != 2 && A + E + F == 2 && (B + C == 0 || B + C == 2) && C + D == 1 && (D + E == 1 || D == 1))//判断条件 { cout << "A " << (A ? "" : "不") << "去。" << endl; cout << "B " << (B ? "" : "不") << "去。" << endl; cout << "C " << (C ? "" : "不") << "去。" << endl; cout << "D " << (D ? "" : "不") << "去。" << endl; cout << "E " << (E ? "" : "不") << "去。" << endl; cout << "F " << (F ? "" : "不") << "去。" << endl; } } } } } } } return 0; }