工作分配问题

工作分配问题

时间限制: 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;
}


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值