DFS入门 背包问题

目录

  • DFS
    • 经典例题 背包问题
    • 思路
    • 代码实现
    • 写在后面

DFS

深搜(也可以称为回溯法),可以理解为不撞南墙不回头,只有一直搜索下去,直到不满足结果,返回到上层,重新选择分支。

经典例题 背包问题

n个物品,每个物品的重量是w[i] 每个物品的价值是c[i],现在背包最大容量是V,那么如何选择这n个物品可以使背包中的物品价值最大

思路

本题涉及到对每个物品的选择,即可以将其看作岔路口,选择或者不选择是两个分支。
除此之外,应该设置目前的总重量sumW,以便确定是否撞了“南墙”,“南墙”的设置是当前总重量不能大于V背包总容量。
总价值sumC是为了确定满足南墙的选择组合是否为最大价值。
对下标为i的物品,选择即进入到DFS(i+1,sumW+w[i],sumC+c[i])分支
不选择则进入到DFS(i+1,sumW,sumC)分支
结束条件是i>=n,即遍历完所有的物品

代码实现

#include <iostream>
using namespace std;
int w[5]={3,5,1,2,2};
int c[5]={4,5,2,1,3};
int V=8;
int n=5;
int maxValue = 0;
void DFS(int i,int sumW,int sumC)
{
    if(i>=n&& sumW<=V)
    {
        if(sumC>maxValue)
        {
            maxValue = sumC;
        }
    }
    if(i>=n || sumW>V) //剪枝
    {
        return;
    }
    DFS(i+1,sumW+w[i],sumC+c[i]);
    DFS(i+1,sumW,sumC);
}
int main(int argc, const char * argv[]) {
    DFS(0,0,0);
    cout<<maxValue<<endl;
    return 0;
}

写在后面

刚接触DFS,后面会总结更多的题的

你可能感兴趣的:(算法)