工作分配问题
时间限制: 1 Sec 内存限制: 128 MB[ 提交][ 状态][ 讨论版]
题目描述
设有n件工作分配给n个人。为第i个人分配工作j所需的费用为c[i][j] 。试设计一个算法,计算最佳工作分配方案,为每一个人都分配1 件不同的工作,并使总费用达到最小。
输入
第一行一个正整数n(1<=n<=20),接下来的n 行,每行n 个数,表示工作费用 。
输出
输出有m行,每行输出最小总费用。
样例输入
5
50 43 1 58 60
87 22 5 62 71
62 98 97 27 38
56 57 96 73 71
92 36 43 27 95
样例输出
144
# include<stdio.h> # include<string.h> int max,k; int n,a[25][25],b[25]; void dfs(int sum,int c1) //c1为第几个人,sum代表总的费用 { if(sum<max&&c1==n) { max=sum; } else if(sum<max) { //剪枝 (当 c1<n时,若sum>max这没必要再执行) for(int i=0;i<n;i++) { if(!b[i]) //标记第几个任务 { b[i]=1; sum+=a[c1][i]; //sum加上第c1个人所需的费用 dfs(sum,++c1); c1--; //上面加上的 再减去 b[i]=0; //解除标记 sum-=a[c1][i]; // sum减去第c1个人所需的费用 } } } return ; } int main(){ scanf("%d",&n); int i,j; max=0x3f3f; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]); memset(b,0,sizeof(b)); dfs(0,0); printf("%d\n",max); return 0; }