博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法第5章作业
阅读量:7045 次
发布时间:2019-06-28

本文共 1242 字,大约阅读时间需要 4 分钟。

一、对回溯算法的理解

  回溯算法首先需要构建解空间,然后对解空间进行遍历。为了降低时间复杂度,需要建立限界函数或约束函数,避免去遍历明显不可能的分支。

二、“子集和”问题的解空间结构和约束函数

  “子集和”问题可以描述为一棵完全二叉树,每一层的左子树表示对选择当前元素,右子树表示不选择当前元素。

  对于约束函数的构建:用rest表示尚未选择的元素的总和,sum表示已选择元素的总和,a[t]表示当前正在元素,result表示需要匹配的目标值。if(sum+a[t]<=result),选择当前元素,sum +=a[t],进入左子树;if(sum+a[t]>=result),,不选择当前元素,进入右子树。

#include
using namespace std;int n;int *a;int *p;int sum=0,rest=0,flag=0;int result;void Backtrack(int t){ if(sum==result) { flag=1; return ; } if(t>n) return ; rest -=a[t]; if(sum+a[t]<=result){ p[t]=1; sum=sum+a[t]; Backtrack(t+1); if(flag) return; sum -=a[t]; } if(sum+rest>=result){ p[t]=0; Backtrack(t+1); if(flag) return; } rest +=a[t]; }int main(){ cin>>n>>result; a=new int[n+1]; p=new int[n+1]; for(int i=1;i<=n;i++){ cin>>a[i]; rest +=a[i]; p[i]=0; } Backtrack(1); if(!flag) cout<<"No Solution!"; else for(int i=1;i<=n;i++) if(p[i]) cout<
<<" "; return 0;}

三、在本章学习过程中遇到的问题及结对编程的情况

  回溯法的思想理解起来不难,但是用回溯法解题需要比较高的技巧,限界函数和约束函数的选择是个很大的问题。结对编程时曾和队友对函数的构建出现了较大的分歧,最后还是和平解决了。

转载于:https://www.cnblogs.com/underdestiny/p/10158618.html

你可能感兴趣的文章
我的友情链接
查看>>
Angular2 AoT编译以及Rollup摇树优化
查看>>
ReactJS 学习资料汇总
查看>>
IIS权限应该怎么给?
查看>>
SpringMVC 拦截器和过滤器的区别&&Struts2拦截器和过滤器的区别
查看>>
Access:collating sort order SortOrder[2052(0)]
查看>>
Spark算子:RDD基本转换操作(1)–map、flagMap、distinct
查看>>
我的友情链接
查看>>
shell学习(二)变量
查看>>
Delphi随机数
查看>>
[置顶] webservice系列3---chain
查看>>
hibernate XML配置文件》cfg
查看>>
ExtJS2.0实用简明教程 - ExtJS的组件
查看>>
员工离职原因,只有两点最真实,其他都是扯淡!
查看>>
删除dataGridview中选中的一行或多行
查看>>
使用包ldap3进行Python的LDAP操作
查看>>
#4 Move Find into Model
查看>>
html5 canvas模拟的爆炸效果
查看>>
nodejs中几个excel模块的简单对比
查看>>
面向对象三大特征
查看>>