/*
时间:2011-11-20
作者:xiaosi
题目:工作分配问题
*/
#include<iostream>
#include<cstdio>
using namespace std;
#define M 100
class Work
{
friend void work();
private:
void Backtrack(int t);
int N;//N件工作 N个人
int cw;//当前费用
int bestw;//最少费用
int flag[M];
int c[M][M];//费用
public:
void Print();
};
void Work::Backtrack(int t)
{//搜索t第层
int i,j;
if(t>N)//到达叶子节点
{
if(cw<bestw)
{
bestw = cw;
}
return;
}
else
{
for(i=1;i<=N;i++)
{
if(cw<bestw&&flag[i]==0)
{
cw+=c[t][i];
flag[i]=1;
Backtrack(t+1);
cw-=c[t][i];
flag[i] = 0;
}
}
}
}
void work()
{
int i,j;
Work w;
w.bestw = 1000000;
w.cw = 0;
scanf("%d",&w.N);
for(i=1;i<=w.N;i++)
{
for(j=1;j<=w.N;j++)
{
scanf("%d",&w.c[i][j]);
}
}
for(j=1;j<=w.N;j++)
{
w.flag[j]=0;
}
w.Backtrack(1);
printf("%d\n",w.bestw);
}
int main()
{
work();
return 0;
}
回溯法之工作分配问题
最新推荐文章于 2024-05-28 16:50:27 发布