[编程题] 工作安排
时间限制:1秒
空间限制:32768K
现在有n位工程师和6项工作(编号为0至5),现在给出每个人能够胜任的工作序号表(用一个字符串表示,比如:045,表示某位工程师能够胜任0号,4号,5号工作)。现在需要进行工作安排,每位工程师只能被安排到自己能够胜任的工作当中去,两位工程师不能安排到同一项工作当中去。如果两种工作安排中有一个人被安排在的工作序号不一样就被视为不同的工作安排,现在需要计算出有多少种不同工作安排计划。
输入描述:
输入数据有n+1行: 第一行为工程师人数n(1 ≤ n ≤ 6) 接下来的n行,每行一个字符串表示第i(1 ≤ i ≤ n)个人能够胜任的工作(字符串不一定等长的)
输出描述:
输出一个整数,表示有多少种不同的工作安排方案
输入例子:
6 012345 012345 012345 012345 012345 012345
输出例子:
720
解题思路:每个人只能做工作序号表里的一件工作且两个人不能同时做一件工作。
AC思路:采用暴力枚举每种可能的分配方案,子问题的解决逐步向上解决了母问题,最终原问题得解。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 vector<string> a; //a保存工作序号表 6 int n; 7 int b[10]; //标志数组b[i]用来记录编号为i的工作是否已经被分配,为0表示已分配,为1表示未分配 8 int ret; //记录分配计划数目 9 10 void dfs(int i) {//dfs[i]指当编号为0到i-1的人都已分配好工作时为编号为i到a.size()-1的人分配工作 11 if(i == a.size()) { 12 ret++; //一种分配方案结束 13 } else { 14 for(int j = 0; j < a[i].size(); j++) { 15 if(b[a[i][j] - '0']) { 16 b[a[i][j] - '0'] = 0; 17 dfs(i + 1); 18 b[a[i][j] - '0'] = 1; 19 } 20 } 21 } 22 } 23 24 int main() { 25 26 while(cin >> n) { 27 for(int i = 0; i < n; i++) { 28 string x; cin >> x; 29 a.push_back(x); 30 } 31 for(int i = 0; i < 10; i++) b[i] = 1; 32 ret = 0; 33 dfs(0); 34 cout << ret << endl; 35 } 36 return 0; 37 }