第五章作业
1.你对回溯算法的理解
答:回溯算法可以系统地搜索一个问题的所有解或任一解。是一个既带系统性又带跳跃性的搜索算法。回溯法就是从根结点开始出发,以深度优先方式搜索整个解空间,这个开始的结点是活结点,也是扩展结点,在当前扩展结点处,往左深入搜索,如果不符合约束条件,则为死结点,返回上一个扩展结点,往右搜索,直到找到所要求的解或者是判断没有活结点。
2.请说明“子集和”问题的解空间结构和约束函数
设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法。
解空间结构:
约束函数:子集和为c。sum+a[t]<=c。
#include<iostream> using namespace std; int n,m; int a[1000]; int sum=0,rest=0; int x[1000]={0}; bool backtrack(int t){ if (sum==m) return true; if (t>=n) return false; rest-=a[t]; if(sum+a[t]<=m){ x[t]=1; sum=sum+a[t]; if(backtrack(t+1)) return true; sum-=a[t]; } if (sum+rest>=m){ x[t]=0; if(backtrack(t+1)) return true; } rest+=a[t]; return false; } int main(){ cin>>n>>m; for (int i=0;i<n;i++){ cin>>a[i]; rest+=a[i]; } if(!backtrack(0)){ cout<<"No Solution!"; } else{ for(int i=0;i<n;i++){ if(x[i]==1){ cout << a[i] << " "; } } cout<<endl; } return 0; }
3.请说明在本章学习过程中遇到的问题及结对编程的情况
答:我的同伴总是喜欢深究问题,总是喜欢问为什么,但我又总是回答不上来,在找答案的过程中,原本不是很模糊的理解会逐渐清晰。就比如“回溯法是在哪里体现了回溯”“右子树遍历是在哪里体现的”等等。