第5章上机实践报告

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)解空间

解空间为{x1,x2,x3,······,xn},其中xi=1,2,3,4···,n,表示第i个人安排的工作号。

(2)解空间树:以测试样例为例,解空间树如下:

(3)剪枝方法

1、每个工作是否已被分配,如已被分配,则不再分配给下一个人。

2、如果判断当前费用c已经大于之前算

(4)代码实现

 1 #include <iostream>
 2 using namespace std;
 3 int n;//工作数量
 4 int a[21][21];//工作费用
 5 int flag[21];//标记是否已经分配过
 6 int bestc = 0;//最少费用
 7
 8 void backtrack(int i,int c){
 9     if(i>n&&c<bestc){
10         bestc = c;
11         return;
12     }
13     if(c<bestc)
14         for(int j=1;j<=n;j++){
15             if(flag[j]==0){
16                 flag[j]=1;
17                 backtrack(i+1,c+a[i][j]);
18                 flag[j]=0;
19             }
20         }
21     }
22
23
24 int main(){
25     cin>>n;
26     for(int i=1;i<=n;i++){
27         for(int j=1;j<=n;j++){
28             cin>>a[i][j];
29         }
30         flag[i]=0;//初始都没有分配工作
31         bestc += a[i][i];//初始费用初始化为对角线之和
32
33     }
34     backtrack(1,0);
35     cout<<bestc;
36     return 0;
37
38 }

4、心得体会

(1)本次实践过程让我加深了对回溯算法的理解,特别是回溯的过程和限界函数,可能在上课的时候听老师讲是有点似懂非懂的,但是通过上机实践之后能很快发现自己不懂的地方在哪里,能比较快地发现自己的问题。

(2)不管是0-1背包还是这道工作分配,我觉得确定解空间树还是比较简单的,比较难的是回溯的过程还有限界函数的确定,需要在对解空间树的理解的基础上进行分析。还有就是不能死套框架,像我们在解工作分配这道题的时候,一开始觉得它与旅行售货员问题很像,所以就想套用旅行售货员的框架,结果就出了一点小问题,后来才发现这道题是没有旅行售货员那么复杂的,所以在解题的时候要懂得灵活应用,而不是一味地套框架。

原文地址:https://www.cnblogs.com/huangroumin/p/10164132.html

时间: 2024-08-30 17:47:53

第5章上机实践报告的相关文章

09.19算法第二章上机实践报告

算法第二章上机实践报告 https://edu.cnblogs.com/campus/gdwywm/se1803/homework/7608 1.实践题目 7-3 两个有序序列的中位数 https://pintia.cn/problem-sets/1173827583729741824/problems/1173827629514764290 2.问题描述 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A ?0 ?? ,A ?1 ?? ,?,A ?N−1 ?

揭露动态规划真面目——算法第三章上机实践报告

算法第三章上机实践报告 一.        实践题目 7-2 最大子段和 (40 分) 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5

贪心算法?我全都要!——算法第四章上机实践报告

算法第四章上机实践报告 一.        实践题目 4-1 程序存储问题 (90 分) 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是 li,1≤i≤n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序. 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数. 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L.接下来的1行中,有n个正整数,表示程序存放在磁带上的长度. 输出

第二章上机实践报告

实践报告任选一题进行分析.内容包括: 实践题目: 7-1 二分查找 (20 分) 输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入格式: 输入共三行: 第一行是n值: 第二行是n个整数: 第三行是x值. 输出格式: 输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 问题描述:问题是让我们设计一个二分查找,在已经输入的数组里找到我们输入的数字,

『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)

本文索引目录: 一.PTA实验报告题1 : 数字三角形 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 最大子段和 2.1 实践题目 2.2 问题描述 2.3 算法描述 2.4 算法时间及空间复杂度分析 三.PTA实验报告题3 : 编辑距离问题 3.1 实践题目 3.2 问题描述 3.3 算法描述 3.4 算法时间及空间复杂度分析 四.实验心得体会(实践收获及疑惑) 一.PTA实验报告题1 : 数字三角形 1.1 实践题目: 1

『嗨威说』算法设计与分析 - 算法第二章上机实践报告(二分查找 / 改写二分搜索算法 / 两个有序序列的中位数)

本文索引目录: 一.PTA实验报告题1 : 二分查找 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 改写二分搜索算法 2.1 实践题目 2.2 问题描述 2.3 算法描述 2.4 算法时间及空间复杂度分析 三.PTA实验报告题3 : 两个有序序列的中位数 3.1 实践题目 3.2 问题描述 3.3 算法描述 3.4 算法时间及空间复杂度分析 四.实验心得体会(实践收获及疑惑) 一.PTA实验报告题1 : 二分查找 1.1 实践

【实践】算法第二章上机实践报告

1. 实践题目 7-3 两个有序序列的中位数 2. 问题描述 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A?0??,A?1??,?,A?N?1??的中位数指A?(N?1)/2??的值,即第?(N+1)/2?个数(A?0??为第1个数). Input 在一行中输出两个输入序列的并集序列的中位数. Sample 输入1: 5 1 3 5 7 9 2 3 4 5 6 输出1: 4 输入2: 6 -100 -10 1 1 1 1 -50 0 2 3 4 5 输出

算法第3章上机实践报告

1.实践题目  7-1 数字三角形 2.问题描述 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法, 计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 3.算法描述 求以一个的数为顶至底的数字总和 等于求以这个数左边或右边的数为顶至底的数字总和的最大值加上这个数本身 得出递推方程 m[i][j]=max( m[i+1][j], max[i+1][j+1] )+a[i][j] 从下至上填表 4.算法时间及空间复杂度分析 双重循环对维

第3章上机实践报告

1.实践题目 7-3 编辑距离问题 (30 分) 2.问题描述 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括 (1)删除一个字符: (2)插入一个字符: (3)将一个字符改为另一个字符. 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B). 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B). 3.算法描述 ★数据输入:输入1组数据.每组数据两行,每行一个字符串. 每个字符串长度不超过2000: ★初始化