2023/2/23【搜索】深度优先搜索解决01背包问题

一、深度优先搜索(DFS)

假设我们处于一个迷宫当中,我们为了走出去,制定了一个方法:遇到分叉路口就往右走,直到遇到死胡同时,我们退回上一个分叉,继续向右走。按这个方法依次试探,我们就能走遍迷宫所有的路线,走出迷宫。我们可以用递归的方式来实现。

二、01背包问题

给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi 。

问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?

01背包问题的“分岔路“就是每个物品的选与不选,当物品的总重量大于容量时,便是死胡同。通常我们用index来表示当前处理的物品编号。还需要maxC和maxW来记录总价值和总重量,所以DFS函数应该是以下形式:DFS(int index,int sumW,int sumC);

总体代码实现如下:


#include<bits\stdc++.h>
using namespace std;
int n,V,maxValue=0;
int w[30],c[30];
void DFS(int index,int sumW,int sumC) {
    if(index==n) {
        if(sumW<=V&& sumC>maxValue) {
            maxValue=sumC;
        }
        return ;
    }
    DFS(index+1,sumW,sumC);//不选当前物品 
    DFS(index+1,sumW+w[index],sumC+c[index]);//选了当前物品 
}
int main() {
    cin>>n>>V;
    for(int i=0; i<n; i++) {
        cin>>w[i];
    }
    for(int i=0; i<n; i++) {
        cin>>c[i];
    }
    DFS(0,0,0);
    cout<<maxValue<<endl;
    return 0;
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值