【手把手带你刷LeetCode】——13.背包问题(DFS)

简介: 背包问题(DFS)

【前言】

今天是力扣打卡第13天!

加油啦!!


原题:背包问题(DFS)

题目描述:

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

示例:

输入:物品重量:3 5 1 2 2  物品价值:4 5 2 1 3
输出:10


题解:

在这个问题中,需要从n件物品中选择若干件物品放入背包,使它们的价值之和最大。这样的话,对每件物品都有选和不选两种选择,而这就是所谓的“岔道口”。而当完成对于n件物品的选择之后就到达了“死胡同”,不过本题需要额外再多考虑一种情况,题目要求选择的物品总和不能超过v,因此一旦选择的物品重量总和超过v,也就会到达“死胡同”,所以这道题目需要多考虑一下,铁汁们要小心哦,具体的看代码实现。

代码实现:

//题目:有n件物品,每件物品的重量为w[i],价值为c[i](由于每件都不同,所以采用i表示变化的意思)。现在需要选出若干件物品放入一个
//容量为V的背包中,使得在选入背包的物品重量和不超过V的前提下,让背包中物品的价值之
//和最大,求最大价值(1 <= n <= 20)
#include<stdio.h>
int maxValue = 0;//最大价值
//下面四组数据可以自己设定,由于想简化题目所以在这里直接以全局变量的形式给出
int n = 5;//物品数目
int v = 8;//背包容量
int w[] = { 3,5,1,2,2 };//w[i]为每件物品重量
int c[] = { 4,5,2,1,3 };//c[i]为每件物品价值
//index为当前处理物品的下标(物品下标范围是0~n - 1)
//sumW和sumC分别为当前总重量和当前总价值
void DFS(int index, int sumW, int sumC)
{
  //已经完成了对n件物品的选择(递归边界--死胡同)
  if (index == n)
  {
    return;
  }
    //岔道口
  DFS(index + 1, sumW, sumC);//不选第index件物品
  //只有加入第index件物品后未超出容量v,才能继续执行(注意这个限制条件)
  if (sumW + w[index] <= v)
  {
    //注意哦,如果加入第index件物品后总价值大于最大价值maxValue时记得要更新最大价值
    if (sumC + c[index] > maxValue)
    {
      maxValue = sumC + c[index];//更新最大价值maxValue
    }
    DFS(index + 1, sumW + w[index], sumC + c[index]);//选择第index件物品
  }
}
int main()
{
  DFS(0, 0, 0);//初始时为第0件物品、当前总重量和总价值均为0
  printf("满足条件的最大价值为:%d\n", maxValue);
  return 0;
}

结语

今天是力扣打卡第13天!

加油哦铁汁们,不负韶华!!


相关文章
|
6月前
|
Go
golang力扣leetcode 125背包问题(二)
golang力扣leetcode 125背包问题(二)
60 0
|
5月前
|
存储 算法 数据挖掘
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
|
5月前
|
存储 SQL 算法
LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树
LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树
|
6月前
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
|
6月前
|
算法 定位技术
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
73 0
|
存储 算法 C语言
【DFS】LeetCode 17. 电话号码的字母组合
看第一个示例:输入"23",其对应的是"abc"与"de".根据全排列的特点,我们先把它们按层状结构写开,之后依次排列组合即可
77 0
|
6月前
代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集
代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集
44 0
|
6月前
|
Go
golang力扣leetcode 92背包问题
golang力扣leetcode 92背包问题
33 0
|
算法
从小白开始刷算法 dfs篇 leetcode.200
从小白开始刷算法 dfs篇 leetcode.200