回溯法3--工作分配问题

                                       工作分配问题
  问题重述:
  设有n件工作分配给n个人。将工作i分配给j个人所需的费用为cij.设计一个算法,为每一个人都分配1件不同的工作,并使总费用达到最小。
  例子:
     第一个工作分配该三个人的相应费用10,2,3
      第二个工作分配该三个人的相应费用2,3,4
      第三个工作分配该三个人的相应费用3,4,5

   解:方案:工作安排2,1,3分配给三个工作。

 

#include<stdio.h>
#include<math.h>

/*
   名称:swap
   功能:交换两个整数

   输入:
   输出:

   作者:刘荣
   时间:2013/5/17

   备注:
*/
void swap(int &x, int &y)
{
	int temp = x;
	x = y;
	y = temp;
}
/*
   名称:next
   功能:递归求解最优方案

   输入:
   输出:

   作者:刘荣
   时间:2013/5/17

   备注:
*/

void next(int i,int n, int c[][3], int *x, int &bestv, int *bestx)
{
	int j,v;
	if(i > n)//到达叶子节点
	{
		v=0;
		for(int k=1; k <= n; k++)
		{
		   v += c[k-1][x[k-1]];
		}
		if(v < bestv)
		{
			bestv = v;
			for(int k=1; k <= n; k++)
			{
				bestx[k-1] = x[k-1];//记录下最有方案
			}
		}
		return;
	}
	//组合排列
	for(j = i; j <= n; j++)
	{
		swap(x[i-1],x[j-1]);
	    next(i+1,n,c,x,bestv,bestx);
		swap(x[i-1], x[j-1]);
	}
}

/*
   名称:solve
   功能:开始求解,包括初始化

   输入:
   输出:

   作者:刘荣
   时间:2013/5/17

   备注:
*/
void solve(int n,int c[][3], int *bestx, int &bestv)
{
	int i;
	int *x = new int[n];
	for(i = 1; i <= n; i++)
	{
		x[i-1] = i-1;
	}
	bestv = 0;
	for(i = 1; i <= n; i++)
	{
		bestv += c[i-1][i-1];
	}
	next(1,n,c,x,bestv,bestx);
}
int main()
{
	int n = 3;
	int c[][3] = {{10,2,3},{2,3,4},{3,4,5}};
	int *bestx = new int[n];
	int bestv=0;
	solve(n,c,bestx,bestv);

	printf("最优工作安排的时间:%d \n\r",bestv);
	printf("最优工作安排: \n\r");
	for(int i = 1;i <= n; i++)
	{
		printf("工作%d:第%d个人,",i,bestx[i-1]+1);
	}

	return 0;
}

 

 

    原文作者:回溯法
    原文地址: https://blog.csdn.net/liurong_cn/article/details/8948195
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞