算法第5章作业

  1. 你对回溯算法的理解(2分)
  2. 请说明“子集和”问题的解空间结构和约束函数(2分)
  3. 请说明在本章学习过程中遇到的问题及结对编程的情况(1分)

1.回溯法的理解:

回溯法实质上就是穷举法,不过加上了约束函数和限界函数,比如有些步骤进行到一半发现结果已经不可能符合条件就舍去,还有些符合条件但是进行到发现这不是最优解的时候就可以舍弃,就是通过这样的方式来将穷举法一步一步优化,回溯法主要两种算法框架,一种是子集树,另一种是排列树。回溯法解题的关键是写约束函数和限界函数。

 

2.子集和问题:

解空间结构:(a1,a2,a3…….an)

 一共有n个子集,如果那个子集被选上,就x[i]=1,否则就是=0;x数组用来记录这个子集有没有被选中。

约束函数:先排序(递增),若当前的和sum加上当前正在进行的ai如果小于要求的和,就是可以继续进行下一步i+1,若sum加上剩余的排在后面的子集的和大于要求的和,就不符合要求,就可以跳过,并回溯到上一个步骤。

 

3.

蓝色的代码是错的,白色的是对的。这道题有些不同的地方是在子集树的模板不能直接套用,就是不能backtrack(i+1),要做个判断if(backtrack(i+1))return 1;因为这道题的解只有可行解没有最优解,而且可行解只要最先找出来的那一组,所以如果找到可行解的组合直接退出函数,不用继续再找了,如果等全部遍历完了,就容易出现问题。

posted @ 2018-12-24 19:58  RainParrot  阅读(174)  评论(0编辑  收藏  举报