zoukankan      html  css  js  c++  java
  • 第五章作业

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

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

  • 相关阅读:
    tp学习 第一天
    Sqlmap绕WAF学习
    绕过验证码进行SQL注入
    sqlmap 命令
    内网基础知识
    运维 | Ubuntu apache2 反向代理 接flask
    re | [watevrCTF 2019]Repyc
    web | [Windows][BJDCTF 2nd]EasyAspDotNet
    web | [BSidesCF 2020]Hurdles
    web | [pasecactf_2019]flask_ssti
  • 原文地址:https://www.cnblogs.com/icyk/p/10155220.html
Copyright © 2011-2022 走看看