题目要求:
输入:第一行是操作员的人数n(4=<n<=11),接下来的n行里每行有n个数,分别表示第i名操作员完成第i项任务的时间。
输出:完成所有任务的最短时间。
测试用例:
Test Input | Expected Output | Time limitation | Memory limitation | Extra process number | |
---|---|---|---|---|---|
Test Case 1 | View plain
| View plain
| 1 seconds | 256M | 0 |
算法分析:
首先我们知道 这道题的暴力算法的复杂度是 N!,虽然题目限制了任务人数的大小,但是其计算量仍然按不容乐观。 匈牙利算法,具体可以到博客
一点心青 下浏览。
这里仿照别人的代码写了 暴力破解的算法,勉强可以通过老师题目,在这个里面可以学到一个函数 ,十分的巧妙: next_permutation
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#define MAX 1000000
using namespace std;
int main()
{
int num;
int c[20][20];
int i,j,temp[20];
int minCost=MAX;
int cost=0;
cin>>num;//输入任务个数
for(i=1;i<=num;i++){
for(j=1;j<=num;j++)
cin>>c[i][j];
temp[i]=i;
}
do{ //利用next_permutation函数依次求出数组的全排列
cost=0;
for(i=1;i<=num;i++)
cost+=c[i][temp[i]];
if(cost<minCost) minCost=cost; //记录最小代价
}while(next_permutation(temp+1,temp+1+num));
cout<<minCost<<endl;
return 0;
}
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#define MAX 1000000
using namespace std;
int main()
{
int num;
int c[20][20];
int i,j,temp[20];
int minCost=MAX;
int cost=0;
cin>>num;//输入任务个数
for(i=1;i<=num;i++){
for(j=1;j<=num;j++)
cin>>c[i][j];
temp[i]=i;
}
do{ //利用next_permutation函数依次求出数组的全排列
cost=0;
for(i=1;i<=num;i++)
cost+=c[i][temp[i]];
if(cost<minCost) minCost=cost; //记录最小代价
}while(next_permutation(temp+1,temp+1+num));
cout<<minCost<<endl;
return 0;
}