成绩 | 10 | 开启时间 | 2018年03月4日 星期日 15:15 |
折扣 | 0.8 | 折扣时间 | 2018年12月11日 星期二 23:15 |
允许迟交 | 否 | 关闭时间 | 2018年12月12日 星期三 23:15 |
只有一组测试用例。 输入:第一行是操作员的人数n(4=<n<=13),接下来的n行里每行有n个数,分别表示第i名操作员完成第i项任务的时间。 输出:完成所有任务的最短时间。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<iostream>
#include<algorithm>
using namespace std;
#define Min 0x7fffffff
int n;
int workers[14][14];
bool flag[14];//任务标记
int mins;
int miN[14];//每列用时最小
void dfs(int k,int time)//k代表到第几个员工,time是当前总用时-
{
int minsum; int j;
if (k >= n+1){//到达搜索终点从新得到答案
mins = min(mins, time);
return; }
if (time > mins) return;//剪枝1,如果当前所用时间time
for (int i = 1; i<=n; i++)//枚举任务
{
if (!flag[i])
{
//剪枝2,,若没选中的任务列最小值之和比mins大,那就直接剪掉了
for (minsum = time + workers[k][i], j = 1; j <= n; j++)
{
if (!flag[j] && j != i)
minsum += miN[j];
}
if (minsum < mins)
{
flag[i] = true;//表示这个任务做过了
dfs(k + 1, time + workers[k][i]);
flag[i] = false;//去掉这个任务做过的标记
}
}
}
}
int main()
{
//freopen("1.txt","r",stdin);
cin >> n;
for (int i = 1; i <= n; i++)
{
miN[i] = Min;
for (int j = 1; j <= n; j++)
cin >> workers[i][j];
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (workers[i][j] < miN[j])
miN[j] = workers[i][j]; //找到每一列的最小值
mins = Min;
dfs(1,0);
cout << mins<<endl;
return 0;
}