#include<bits/stdc++.h>
using namespace std;
#define maxn 25
int inf = 0x3f3f3f3f;
// s数组记录工人和工作搭配的花费
// visited数组记录工人是否已分配工作
// sum记录当前累加的费用
// n为输入数据大小
// minval为最小费用
int s[maxn][maxn], visited[maxn], sum, n, minval;
void dfs(int i)
{
// 分配完毕结束递归
if (i == n){
// 加和小于最小值
if (sum < minval){
minval = sum;
}
return ;
}
// 若此时加和已然大于最小值
// 则不可能成为最小值,结束递归
if (sum >= minval){
return ;
}
for (int j = 0; j < n; j++){
if (!visited[j]){
sum += s[i][j];
visited[j] = 1;
dfs(i+1);
sum -= s[i][j];
visited[j] = 0;
}
}
}
int main()
{
cin>>n;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
cin>>s[i][j];
}
}
sum = 0;
minval = inf;
dfs(0);
cout<<minval<<endl;
return 0;
}
SDUT 1776 - 工作分配问题
最新推荐文章于 2022-11-26 01:00:00 发布