第五章上机实验报告

1.     实践题目及问题描述

工作分配问题;n件工作分配给n个人,为每一个人都分配1 件不同的工作,工作i分配给第j个人所需的费用为cij,设计一个算法,使总费用最小。

2.     算法描述

(1)     解空间

{<x11,x12…x1n>,<x21,x22…x2n>……<xn1,xn2…xnn>}

其中 <x11,x12…x1n>!=<x21,x22…x2n>!=…!= <xn1,xn2…xnn>

(2)     解空间树(n=3为例)

(3)     剪枝方法描述

限界函数:当给所有人分配完工作后就返回

if(t == n+1){

if(cost < best){

best = cost;

return;

}

}

约束函数:当前总费用大于记录的最少费用时回溯,不再往下遍历

if(cost < best){

distribution(t+1);

}

swap(x[t],x[i]);

cost -=c[t][x[i]];

3.     心得体会

觉得这章的回溯法代码比较难理解,不怎么会打,但通过上机课多打对回溯法有了进一步的了解。然而还是存在疑惑,有些代码不知道是怎么回溯的,可能是之前学的调用方法还没学透。有待多练习。

原文地址:https://www.cnblogs.com/lyt823/p/10162293.html

时间: 2024-07-30 00:27:53

第五章上机实验报告的相关文章

算法第五章上机实践报告

一 . 实践题目 7-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 三 . 算法描述 1. 解空间 第一个人选择第几个工作,第

算法第二章上机实验报告

1.实践题目 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和比较次数. 输入样例: 4 1 2 3 4 1 输出样例: 0 2 2.问题描述 本道题是让我们输入非降序排列的整数,也就是说是排好

第二章上机实验报告

1.实践题目:7-1 2.问题描述:使用二分查找算法在n个非降序排列的整数中查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 3.算法描述:将n个元素分成个数大致相同的两半,取a[mid]与x比较.如果x=a[mid],则找到x,算法终止:如果x<a[mid],则只在数组a的左半部继续查找x,如果x>a[mid],则只在a的右半部继续搜索x.同时,在while语句里加一个b统计比较次数. 4.代码如下: 1 #include<iostream> 2

算法第三章上机实验报告

1.实践题目 7-2 最大子段和 2.问题描述 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 3.算法描述 首先将数据保存到一个数组内,然后建立一个循环来遍历这些数组,定义一个sum来保存和,定义一个max来保存最大值,对于每次遍历的结果x,如果sum为负,则将sum的值更改为x,并与max做对比,若比max大则将sum的值

算法第四章上机实验报告

题目:删数问题 问题描述:输入一个正整数a和一个正整数k(k≤n ),在n位正整数a中去掉其中任意k个数字后,剩下的数字按原次序排列组成一个新 的正整数. 算法描述:从前往后进行比较,删掉升序的最后那个数,若一直保持升序,则删掉最后一位数,重复k次,删掉k个数 时间复杂度:该算法主要进行了k次的for循环,每次循环的时间复杂度是o(n),故其时间复杂度为o(n) 空间复杂度:该算法不需要额外的数组或变量来存放数据,故其空间复杂度为o(1) 心得体会:在做题的时候还要再细心一点,特别对于一些小细节

第五章上机实践报告

1.实践问题: 工作分配问题 2.问题描述: 设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 3.算法描述: 1)解空间:排列树 2)测试样例的解空间树: 3)剪枝方法: void Backtrack(int t){ for(int k=1;k<=n;++k){ if(!b[k]){ b[k]=1; sum+=p[k][t]; if(t==n){ if(sum<best) best

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

算法第三章上机实践报告 一.        实践题目 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

微机接口技术与汇编语言上机实验报告_汇编初步(intel8086)

实验环境:intel x386 一.要求:将3000H单元开始置数为00H-0FH SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE, SS:SSTACK START: PUSH DS XOR AX, AX MOV DS, AX MOV SI, 3000H MOV CX, 16 AA1: MOV [SI], AL INC SI INC AL LOOP AA1 ;CX == 0? NEXT():AA1

算法第三章上机实验

算法第三章上机实验 数字三角形 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. #include <iostream> using namespace std; int maxsum(int a[100][100],int n){ int b[100][100]={0}; for(int i=n-1;i>=0;i--){ for(int j=i;j>=0;j--){