〖編程·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
改进的代码
由文件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; }
相关文章推荐
- 〖編程·C++〗回溯算法:排列树 - N皇后问题
- 〖編程·C++〗回溯算法:子集树 - 符号三角形问题
- C++搜索与回溯算法之马走日(遍历问题)
- 工作分配问题 Java 回溯
- C++搜索与回溯算法之字符串全排列
- C++搜索与回溯算法之全排列问题
- C++搜索与回溯算法之素数环问题
- 回溯法3--工作分配问题
- 【C/C++】回溯经典算法之-->八皇后问题
- c++实现回溯算法解决图的M着色问题
- 算法分析之工作分配问题
- C++搜索与回溯算法之八皇后问题
- 回溯法之工作分配问题
- C++搜索与回溯算法之棋盘问题
- 回溯法之工作分配问题
- 排列的字典序问题 算法与设计
- 算法面试题1:约瑟夫问题(c++实现方式)
- 排列类算法问题大总结
- 算法学习——回溯之伯努利装错信封问题
- 有人机交互能力的排列组合算法(C++版)