算法总结-深度优先搜索

不碰南墙不回头。
常用于给定一个序列,枚举子序列选择满足某个特征的最优子序列

  1. 有n见物品,给出重量和价值,在不超过容量V的前提下求最大价值
#include<cstdio>

int n,v,max = 0; //物品件数,背包容量,最大价值
int w[10],c[10];//重量,价值

void DFS(int index,int sumW,int sumC){
    if(index == n){
        if(sumW < v && sumC > max){
            max = sumC;
        }
        return;
    }
    DFS(index+1,sumW,sumC); //不选下一件物品
    DFS(index+1,sumW+w[index],sumC+c[index]); //选择下一数据
}


//剪枝
void DFS2(int index,int sumW,int sumC){
    if(index == n){
        return;
    }
    DFS(index+1,sumW,sumC); //不选下一件物品
    if(sumW+w[index] <= v){
        if(sumC + c[index] >max){
            max = sumC+c[index];
        }
        DFS(index+1,sumW+w[index],sumC+c[index]); //选择下一数据
    }
}

//测试数据
//5 8
//3 4 1 2 2
//4 5 2 1 3
//10
//DFS 解决问题的核心,给定一个序列,枚举这个序列的所有子序列(不一定连续),寻找最优解
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",&c[i]);
    }

    DFS2(0,0,0); //初始状态
    printf("%d\n",max);

}
  1. 从n个整数中选取k个数,在和为x的条件下,求序列最大的平方和。

如果需要保存路径,需要使用vector

#include <cstdio>
#include <vector>
using namespace std;

int n = 4,k = 2,x = 6,Max = 0; //n个整数,选k个数,和为x
int arr[] = {2,3,3,4};//n个整数
vector<int> temp;
vector<int> ans;
void DFS(int index,int sumK,int sumX,int sumSq) {
    if(sumK == k && sumX == x){
        if(sumSq > Max){
            Max = sumSq;
            ans = temp;
        }
    }
    if(index == n || sumK > k || sumX >x) return;
    DFS(index+1,sumK,sumX,sumSq);
    temp.push_back(arr[index]);
    DFS(index+1,sumK+1,sumX+arr[index],sumSq+arr[index]*arr[index]);
    temp.pop_back();

}

int main(){
    DFS(0,0,0,0);
    printf("%d\n",Max);
    for(int i : ans){
        printf("%d ",i);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度优先搜索是一种图搜索算法,它的基本思想是从起始节点开始,沿着一个分支一直向下搜索,直到无法继续下去或者找到目标节点为止。如果遇到无法继续下去的情况,算法会回溯到上一个节点,然后沿着另一个分支继续搜索,直到所有的节点都被访问过为止。这种搜索方式可以看作是一种纵向搜索,因为它会一直沿着某个分支往下搜索,直到找到目标节点或者无法再继续下去。 深度优先搜索的优点是简单易实现,并且能够快速找到解决方案,尤其对于那些路径较深的问题,深度优先搜索能够更快地找到解。然而,深度优先搜索也存在一些缺点。首先,它是一种盲目搜索算法,没有启发式信息来指导搜索方向,可能会浪费时间在无效的搜索路径上。其次,深度优先搜索不完备,即使问题有解,也不能保证一定能找到解。另外,深度优先搜索得到的解,不一定是路径最优的解。 总结来说,深度优先搜索是一种简单而有效的搜索算法,可以用于解决很多问题。它的基本思想是从起始节点开始,沿着一个分支一直向下搜索,直到无法继续下去或者找到目标节点为止。然而,深度优先搜索也存在一些缺点,包括盲目搜索和不完备性。因此,在使用深度优先搜索时,需要根据具体问题的特点来权衡使用该算法的利弊,并进行适当的优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [从九宫问题浅谈广度优先搜索深度优先搜索策略](https://blog.csdn.net/pansong291PS/article/details/83060552)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [java实现图结构以及深度优先搜索和广度优先搜索](https://blog.csdn.net/feinifi/article/details/100807239)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值