算法第五章上机实践报告
2021/12/11 14:17:33
本文主要是介绍算法第五章上机实践报告,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
算法第五章上机实验报告
一、回溯法分析
1.1 说明“最小重量机器设计问题”解空间
首先可以先将第一个工作分配给第一个人,那么第一个工作就已经完成了,第二和第三个人可以从第二和第三个工作中选择,分别出现各自对应的两种情况。其次,第一个人也可以选择第二和第三个工作,那么就是每个人都有可能对应每一个工作,这个问题的解空间就是一颗排列Tree,其每一个节点的策略是选择剩下的元素的一个。
1.2 说明 “最小重量机器设计问题"的解空间树
如图所示,问题的解空间树与之类似。(除去A-B)
首先从B-CDE即为第一个人选择的三个不同的工作,对应三种不同的情况。如果选择B-D,那么第二个人就还有剩下两种选择,H和I,当第二个人选择其中的一种,第三个人都只剩下一种情况即N或者O。
1.3在遍历解空间树的过程中,每个结点的状态值
在遍历解空间树的时候,每个每个节点的状态值就是当前层数(对应第几个人)的选择工作以及到这个人位置所累计的工作费用。
二、我对回溯法的理解
代码实现
#include <iostream> using namespace std; int work[100][100]={0}; int x[100]={0}; int minc=1000000,cc=0; int n; void backtrack(int t){ if(t>n){ if(cc < minc){ minc = cc; } return; } for(int i=1;i<=n;i++){ if(x[i]==0){ cc += work[t][i]; x[i]=1; if(cc<minc) backtrack(t+1); x[i]=0; cc -= work[t][i]; } } } int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>work[i][j]; } } backtrack(1); cout<<minc; return 0; }
理解收获:回溯法是利用计算机进行每一种情况进行遍历,以此来得到我们所需要的最终结果,在算法递归遍历的时候,我们需要进行剪纸操作,否则递归层数太多会导致运算时间过长。另外,回溯法每到达一次叶节点,就代表一个结果的出现,并且与理想结果比较,若是,则保存,若不是,则return进行回溯到上一个子问题所得到的结果然后进行再次遍历。回溯法根据需要我们要保存状态并记得状态修改。
这篇关于算法第五章上机实践报告的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南