算法第五章上机实践
1.实践题目 :工作分配问题
2.问题描述
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。
3.算法描述(包括解空间,画出测试样例的解空间树,剪枝(约束函数或限界函数)方法描述)
解空间是一个排列树,用一个二维数组a[i][j]来存工作i分配给第j个人所需的费用cij。
通过if(cost<bcost)来进行剪枝,即未到达叶节点时的费用已经高于目前得到的最小花费时进行剪枝。
#include <iostream> using namespace std; int n,b[25],a[25][25]; int bcost=9999,cost=0; void bt(int i) { if(i>n&&cost<bcost) bcost=cost; if(cost<bcost) { for(int j=1;j<=n;j++) { if(b[j]==0) { b[j]=1; cost+=a[i][j]; bt(i+1); cost-=a[i][j]; b[j]=0; } } } } int main() { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; for(int j=1;j<=n;j++) b[j]=0; bt(1); cout<<bcost; return 0; }
4.心得体会(对本次实践收获及疑惑进行总结)
确定解空间后,在草稿纸上构造一棵树,按深度优先进行搜索。剪枝是个难点,严格的剪枝函数才能避免超时。