第5章实践

实践问题:工作分配问题

问题描述:

有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。

输入格式:

输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。

输出格式:

将计算出的最小总费用输出到屏幕。

 算法描述

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int p[100][100],sum,minn,i,j,n;
bool b[100];
 
void dfs(int dep)
{
	int r;
	for (r=1;r<=n;++r)
	  if (!b[r]) 
	  {
	 	b[r]=1;
	  	sum+=p[r][dep];
	  	if (dep==n)
	  	{
	  		if (sum<minn)
	  		  minn=sum;
	  	}
	  	else 
	  	 if (sum<minn)
		  dfs(dep+1);
	  	sum-=p[r][dep];
	  	b[r]=0;
	  }
}
 
int main()
{
	scanf("%d",&n);//input people number and work number
	for (i=1;i<=n;++i)
	  for (j=1;j<=n;++j)
	    scanf("%d",&p[i][j]);
	sum=0;
	minn=10000;//赋值
	dfs(1);
	printf("%d",minn);//output
	return 0;
}

  剪枝方法:

else 
if (sum<minn)
 dfs(dep+1);
sum-=p[r][dep];
b[r]=0;

  心得体会:对这个问题还是不是很了解,这不是一个好的代码,还是要加深体会

猜你喜欢

转载自www.cnblogs.com/ewerin/p/10165349.html