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> int n,c[21][21],vis[21],min; void f(int x,int y) { int j; if(y>=min) return; if(x>n) { min=y; return; } else for(j=1;j<=n;j++) { if(vis[j]==1) continue; if(vis[j]==0) { vis[j]=1; f(x+1,y+c[x][j]); vis[j]=0; } } } int main() { //freopen("a.txt","r",stdin); int i,j; while(scanf("%d",&n)!=EOF) { memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&c[i][j]); min=10000000; f(1,0); printf("%d\n",min); } return 0; }