工作分配问题

来源:互联网 发布:重庆大学的校园网域名 编辑:程序博客网 时间:2024/05/21 10:23

问题:设有n件工作分配给n个人,将工作i分配给第j个人所需的菲佣为cij,试设计一个算法,为每一个人分配一件不同的工作,并使总费用达到最小。

输入:第一行有一个正整数n,接下来n行,每行n个数,表示工作费用。

输入:最小总费用

例子:输入:3

            10 2 3

             2 3 4

             3 4 5

输出:9


代码:


#include<iostream>
using namespace std;
bool Take1(int pay,int leastpay)
{
if(pay>=leastpay)
return 0;
return 1;
}
void BackTrack(int t,int n,int **m,int *x,int pay,int &leastpay)
{
int i;
if(t>n)
{
if(pay<leastpay)
leastpay=pay;
return ;
}
for(i=1;i<n+1;i++)
{
if(x[i]==0)
{
pay+=m[t][i];
x[i]=1;
if(Take1(pay,leastpay))
BackTrack(t+1,n,m,x,pay,leastpay);
pay-=m[t][i];
x[i]=0;
}
}
}
int main()
{
int n,i,j,pay=0,leastpay=100;
cin>>n;
int **m,*x;
m=new int*[n+1];
x=new int[n+1];
for(i=0;i<n+1;i++)
{
m[i]=new int[n+1];
x[i]=0;
}
for(i=1;i<n+1;i++)
for(j=1;j<n+1;j++)
cin>>m[i][j];
BackTrack(1,n,m,x,pay,leastpay);
cout<<leastpay;
system("pause");
return 0;
}

0 0
原创粉丝点击