标签:names rac 工作 体会 思路 wap image void 初始
工作分配问题
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。
输入格式:
输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。
输出格式:
将计算出的最小总费用输出到屏幕。
输入样例:
在这里给出一组输入。例如:
3
10 2 3
2 3 4
3 4 5
输出样例:
在这里给出相应的输出。例如:
9
解空间:{1,2,······,n} ,第一个元素为第一个工作,元素内容对应为第几个人
解空间树:排列树
剪枝函数:在访问某结点前先进行判断 if (cc+a[i][x[j]]<bestc),从而进行剪纸
1 #include <iostream> 2 using namespace std; 3 4 int n;//work 5 int bestc;//最优费用 6 int cc=0;//当前费用 7 int x[1000];//当前解 8 int a[21][21];//对应工作费用 9 10 void Backtrack(int i){//第i个工作分配 11 if (i>n){ 12 if(cc<bestc) bestc=cc; 13 } 14 else{ 15 for(int j=i;j<=n;j++){//分配给第j个人 16 if (cc+a[i][x[j]]<bestc) 17 { 18 cc+=a[i][x[j]]; 19 swap(x[i],x[j]); 20 Backtrack(i+1); 21 swap(x[i],x[j]); 22 cc-=a[i][x[j]]; 23 } 24 } 25 } 26 } 27 28 int main(){ 29 cin>>n; 30 for(int i=1;i<=n;i++){ 31 for(int j=1;j<=n;j++){ 32 cin>>a[i][j]; 33 bestc+=a[i][j]; 34 } 35 } 36 for(int i=1 ;i<=n;i++)//对x数组进行顺序初始化 37 x[i] = i; 38 Backtrack(1); 39 cout<<bestc<<endl; 40 return 0; 41 }
写代码时先确定解空间树是排列树,然后套用排列树的模板,再考虑限定条件,当当前费用加下一个结点对应费用大于当前最优费用时就进行剪枝,按照这个思路去做,虽然过程中也遇到一些细节问题,但还是很顺利的ac了
标签:names rac 工作 体会 思路 wap image void 初始
原文地址:https://www.cnblogs.com/xjsunshine/p/10164363.html