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
设有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("b.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;
}