您的位置:首页 > 编程语言 > C语言/C++

〖編程·C++〗回溯算法:排列树 - 工作分配问题

2012-12-18 19:07 525 查看
问题描述:设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。试设计一个算法,为每一个人都分配1 件不同的工作,并使总费用达到最小。设计一个算法,对于给定的工作费用,计算最佳工作分配方案,使总费用达到最小。

由文件input.txt给出输入数据。第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。将计算出的最小总费用输出到文件output.txt。例如:

input.txt output.txt

3 9

10 2 3

2 3 4

3 4 5

改进的代码

#include <fstream>
#include <math.h>
using namespace std;

ifstream fin("f:\\gongzuofenpei\\input.txt");
ofstream fout("f:\\gongzuofenpei\\output.txt");
int **cost;
bool *body;
int *best;
int *test;
int cur_cost;
int min_cost;
int n;

int output()
{
fout<<"最低花费为:"<<min_cost<<endl;
for(int i=1;i<=n;i++)
fout<<"第"<<i<<"任务由"<<"第"<<best[i]<<"个人做,花费为"<<cost[i][best[i]]<<";"<<endl;
return 1;
}

int backtrack(int t)
{
if(t>n)
{
if(cur_cost<min_cost)
min_cost=cur_cost;
for(int i=1;i<=n;i++)
best[i] = test[i];

}
else
{
for(int i=1;i<=n;i++)
{
if(body[i])
{
body[i] = false;
swap(cost[t][1],cost[t][i]);
cur_cost+=cost[t][1];
test[t]=i;
if(cur_cost<min_cost) backtrack(t+1);

cur_cost-=cost[t][1];
body[i] = true;
swap(cost[t][1],cost[t][i]);
}
}
}
return 1;
}

int main()
{
fin>>n;
cost = new int*[n+1];
for (int i=1;i<=n;i++)
cost[i] = new int[n+1];

for (int i=1;i<=n;i++)//第i个任务
for(int j=1;j<=n;j++)//第j个人
fin>>cost[i][j];
body = new bool[n+1];
for (int i=1;i<=n;i++)
body[i] = true;

//分配min_cost初值,为第i个任务分配给第i个人的总花费
min_cost = 0;
for(int i=1;i<=n;i++)
min_cost += cost[i][i];
cur_cost=0;
best = new int[n+1];
for(int i=1;i<=n;i++)
best[i] = i;
test = new int[n+1];
for(int i=1;i<=n;i++)
test[i] = 0;
backtrack(1);

output();

for(int i=1;i<=n;i++)
delete cost[i];
delete cost,body,test,best;

fin.close();
fout.close();

return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: