码迷,mamicode.com
首页 > 编程语言 > 详细

算法第五章上机实践报告

时间:2018-12-23 16:56:14      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:names   rac   工作   体会   思路   wap   image   void   初始   

1. 实践题目

工作分配问题

2. 问题描述

设有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,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 }

4. 心得体会

写代码时先确定解空间树是排列树,然后套用排列树的模板,再考虑限定条件,当当前费用加下一个结点对应费用大于当前最优费用时就进行剪枝,按照这个思路去做,虽然过程中也遇到一些细节问题,但还是很顺利的ac了

 



算法第五章上机实践报告

标签:names   rac   工作   体会   思路   wap   image   void   初始   

原文地址:https://www.cnblogs.com/xjsunshine/p/10164363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!