一、对回溯算法的理解(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分)
一开始不清楚回溯算法到底是怎么进行的,跟队友一起把书里面的例子敲了一遍之后,思路逐渐清晰。回溯法基本可以套用框架,把核心算法理解了之后,根据具体问题细做修改,就可以了。
Dream
浙公网安备 33010602011771号