Problem Description
设有n件工作分配给n个人,将工作i分配给第j个人所需的费用为cij。试设计一个算法,为每一个人都分配一件不同的工作,并使总费用达到最小。
Input
输入有多组数据,每组数据的第一行有1个正整数n(1<=n<=20)。接下来的n行,每行n个数,第i行表示第i个人各项工作费用。
Output
对于每组数据输出一行,这一行只包含一个整数,表示最小费用。
Sample Input
3 4 2 5 2 3 6 3 4 5
Sample Output
9
#include<stdio.h> #include<string.h> #define INF 1<<23 int n,maxn; int map[23][23],vis[23]; void dfs(int st,int cnt)//st为行的编号,cnt为当前的最小费用 { if(cnt>maxn) return;//剪枝 if(st==n)//如果所有行都深搜完了 { maxn=(cnt<maxn?cnt:maxn); return; } int i; for(i=0;i<n;i++) if(!vis[i]) { vis[i]=1; dfs(st+1,cnt+map[st][i]);//选择st行的第i个 vis[i]=0; } } int main() { //freopen("a.txt","r",stdin); while(scanf("%d",&n)==1) { int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&map[i][j]); maxn=INF; dfs(0,0); printf("%d\n",maxn); } return 0; }