zoukankan      html  css  js  c++  java
  • 搜索专题

    1.深度优先算法DFS(Depth First Search):

      使用递归可以很好的实现深度优先搜索,也可以使用栈实现,多数情况下还是递归更加方便。

    例,有n件物品,每件物品的重量为w[i],价值为v[i]。先需要选出若干件物品放入一个容量为V的背包中,使得在选入背包的物品重量不超过容量V的前提下,让背包中的物品价值之和最大,求最大价值。(1<=n<=20)

    #include<stdio.h> 
    #include<stdlib.h>
    
    const int maxn = 30;
    int n ,V, maxValue = 0;
    int w[maxn],v[maxn];
    
    void DFS(int index,int sumW,int sumV){        //index为0时为初始状态
        if(sumW > V){    //剪枝
            return ;
        }
        if(index == n){
            if(sumV > maxValue)
                maxValue = sumV;
            return ;
        }
        DFS(index + 1,sumW, sumV);    //不要第index个货物 
        DFS(index + 1,sumW + w[index], sumV + v[index]);    //要第index个货物 
    }
    
    
    int main(){
        scanf("%d%d", &n, &V);
        for(int i = 0;i< n;i++){
            scanf("%d", &w[i]);
        }
        for(int i = 0;i< n;i++){
            scanf("%d", &v[i]);
        }
        DFS(0, 0, 0);
        printf("%d
    ",maxValue);
        return 0;
    }

      通过题目条件的限制来节省DFS计算量的方法称作剪枝

      递归的代码需要注意结束条件和分支选择的实现。

     上述问题给出了一类常见DFS问题的解决方法,级给定一个序列,枚举该序列的所有子序列(可以不了连续)。该问题也等价于从N个整数中选择K个数的所有方案。

      

  • 相关阅读:
    IIS服务器SSL证书安装 (pfx文件不能直接运行时)
    .NET Core创建Worker Services
    1.初步了解IOC容器
    1.Configuration
    2.第一个Codefirst实例
    安装Mysql
    2.我的第一个小程序(获取用户信息--包括敏感信息)
    1.什么是微信小程序
    Repeater的使用
    1.MVC的初步了解
  • 原文地址:https://www.cnblogs.com/a-cloud---/p/11512782.html
Copyright © 2011-2022 走看看