第5章上机实践报告
1.实践问题:工作分配问题
2.问题描述:设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。
3.算法描述:
解空间为排列树。
#代码:
#include <iostream> using namespace std; const int N = 29; int Mincost; int vis[N]; int n; struct rt{ int a[N]; }arr[N]; void backsuo(int cnt,int cost){ if(cnt>=n){ if(cost<Mincost){ Mincost=cost; } return; } if(cost>Mincost)return; //剪枝函数 for(int i=0;i<n;i++){ if(vis[i]==0){ vis[i]=1; cost+=arr[cnt].a[i]; backsuo(cnt+1,cost); cost-=arr[cnt].a[i]; vis[i]=0; } } } int main(){ Mincost=0x3f3f3f3f; cin>>n; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&arr[i].a[j]); } } backsuo(0,0); cout<<Mincost<<endl; return 0; }
4.心得体会:对回溯法以及剪枝函数了解不够透彻,自己无法做出这道题,还需要多打代码。