算法第5章上机实践报告
Posted xm-dream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法第5章上机实践报告相关的知识,希望对你有一定的参考价值。
一、实践题目
7-2 工作分配问题 (20 分)
二、问题描述
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。
输入格式:输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。
输出格式:将计算出的最小总费用输出到屏幕。
输入样例:3
10 2 3
2 3 4
3 4 5
输出样例:9
3、算法描述(包括解空间,画出测试样例的解空间树,剪枝(约束函数或限界函数)方法描述)
(1)解空间
解空间为{x1,x2,x3,······,xn},其中xi=1,2,3,4···,n,表示第i个人安排的工作号。
(2)测试样例的解空间树:
(3)约束函数
if(sum<cc) Backtrack(t+1);表示当前工作费用小于当前费用最优解时,继续下一层搜索。
代码如下:
1 #include <iostream> 2 using namespace std; 3 #include <algorithm> 4 int cc; 5 int sum; 6 int n; 7 int a[21][21]; 8 int x[21]; 9 void Backtrack(int t){ 10 if(t>n&&sum<cc) cc=sum; 11 else{ 12 for(int i=t;i<=n;i++){ 13 sum += a[t][x[i]]; 14 swap(x[t],x[i]); 15 if(sum<cc) Backtrack(t+1); 16 swap(x[t],x[i]); 17 sum -= a[t][x[i]]; 18 } 19 20 } 21 } 22 23 int main(){ 24 cin>>n; 25 for(int i=1;i<=n;i++) 26 for(int j=1;j<=n;j++) 27 cin>>a[i][j]; 28 for(int i=1;i<=n;i++) 29 x[i]=i; 30 sum=0; 31 cc=10000; 32 Backtrack(1); 33 cout<<cc; 34 }
四、心得体会
一开始由于没有很好的了解回溯算法的核心,所以解题思路不够清晰,后来看了书里面的例子,发现其实把回溯框架写好后,问题也基本能解决了,所以最重要的是先把回溯核心算法搞懂。
以上是关于算法第5章上机实践报告的主要内容,如果未能解决你的问题,请参考以下文章