一、对回溯算法的理解(2分)

回溯算法也叫试探法,一般用递归来解决,是一个类似枚举的深度优先搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。回溯法可以通过限界函数和约束函数对问题范围进行剪枝,避免搜索所有的可能性,许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

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

解空间结构如图:

 

约束函数:if(sum<=c) Backtrack(t+1),如果当前背包所装物品重量小于等于背包最大容量,则继续下一层的递归搜索。

代码如下:

 

 1 #include <iostream>
 2 using namespace std;
 3 int x[10000];
 4 int s[10000];
 5 int n;
 6 int c;
 7 int sum=0;
 8 int flag=0;
 9 int Backtrack(int t){
10     if(flag) return flag;
11   if(sum==c) {
12     flag=1;
13         for(int i=1;i<n+1;i++){
14             if(x[i]) cout<<s[i]<<" ";
15         }
16         // return flag;
17   }
18   else if(t<=n && sum<c){
19     sum += s[t];
20     x[t]=1;
21     if(sum<=c) Backtrack(t+1);
22     x[t]=0;
23     sum -= s[t];
24     Backtrack(t+1);
25   }
26 
27   return flag;
28 }
29 int main(){
30   cin>>n>>c;
31   int cc=0;
32   for(int i=1;i<n+1;i++)
33   {
34     cin>>s[i];
35     x[i]=0;
36     cc +=s[i];
37   }
38   int t=1;
39   if(cc<c) cout<<"No Solution!";
40   else Backtrack(t);
41 }

 

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

一开始不清楚回溯算法到底是怎么进行的,跟队友一起把书里面的例子敲了一遍之后,思路逐渐清晰。回溯法基本可以套用框架,把核心算法理解了之后,根据具体问题细做修改,就可以了。

posted on 2018-12-22 12:52  xm_Dream  阅读(152)  评论(0)    收藏  举报