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,后面会总结更多的题的

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值