第五章作业

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.请说明在本章学习过程中遇到的问题及结对编程的情况

答:我的同伴总是喜欢深究问题,总是喜欢问为什么,但我又总是回答不上来,在找答案的过程中,原本不是很模糊的理解会逐渐清晰。就比如“回溯法是在哪里体现了回溯”“右子树遍历是在哪里体现的”等等。

 

posted @ 2018-12-21 13:22  icyk  阅读(146)  评论(0编辑  收藏  举报