问题描述:

给定n个重量为{w1,w2,w3,....,wn}、价值为{v1,v2,v3,...,vn}的物品和一个容量为C的背包,0/1背包问题是求解这些物品中的一个最有价值的子集,并且要能够装到背包中。

蛮力法:

算法描述:

使用蛮力法解决0/1背包问题,就是将所有的物品装入背包的可能全部列举出来(背包问题的蛮力解法是穷举这些物品的所有子集,找出能够装到背包中的所有子集,并在这些子集中找出价值最大的子集)。这个可以通过递归的方式实现。递归的过程可以看成是对一棵树的深度优先遍历:

例如上图,假设从背包中的1号物品开始列举所有的可能。如果每一层仅仅简单的在循环中使用递归,则该程序就不会结束。需要使用一个一维向量用于标记当前哪些编号已经装入了。例如,当前1号物品已经装入背包,首先标记1号物品已经装入。之后,在循环中首先选择2号物品,如果没有超出背包的最大承重的话,标记2号物品已经装入。当前还有3、4号物品没有装入,所以继续递归尝试装入3、4号物品。在装入2号物品之后的所有可能的递归全部完成后,修改当前标记,并将2号物品从背包中拿出,之后就可以递归遍历放入3号物品之后的可能的情况了。
代码如下:


#include <iostream>#include <vector>
#define PAC_MAX_VOL 10  //背包最大承重10
using namespace std;void dfs(const vector<int> weights, const vector<int> vals, bool visit[],
int currWeight, vector<int> seq);void outputResult(vector<int> weights, vector<int> vals, bool visit[],
int currWeight, vector<int> seq);/*** 使用递归的方式遍历所有的可能*/void dfs(const vector<int> weights, const vector<int> vals, bool visit[], int currWeight, vector<int> seq)
{for (int i = 0; i < 4; ++i){if (!visit[i]) {if (currWeight + weights[i] > PAC_MAX_VOL)continue;visit[i] = true;seq.push_back(i);//将当前步加入到序列中dfs(weights, vals, visit, (currWeight + weights[i]), seq); //基于当前状态深度遍历seq.erase(find(seq.begin(), seq.end(), i));     //从序列中删除visit[i] = false;}}outputResult(weights, vals, visit, currWeight, seq);return;
}
/***    输出当前结果*/void outputResult(vector<int> weights, vector<int> vals, bool visit[], int currWeight,vector<int> seq) {cout << "当前背包的重量是:" << currWeight << ", ";int sumVal = 0;for (int i = 0; i < 4; ++i)if (visit[i])sumVal += vals[i];cout << "当前背包的总价值为:" << sumVal << endl;cout << "当前结果集(编号)是:";for (auto ele : seq) {cout << ele << "  ";}cout << "\n-----------------------------" << endl;
}
int main()
{const vector<int> weights = { 7,3,4,5 };        //各个物品的重量const vector<int> vals = { 42,12,40,25 };       //各个物品的价值vector<int> seq;bool visit[4] = {false};            //用于在递归中表示当前已有哪些物品放在背包中了dfs(weights, vals, visit, 0, seq);return 0;}

算法分析:

0/1背包问题(蛮力法)相关推荐

  1. 0/1背包问题-----回溯法求解

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

  2. java蛮力法背包问题_[算法课]五种蛮力法解决01背包问题

    文章目录 注明:题目要求只能使用蛮力法 算法标签:全排列,枚举,二进制,dfs,数组 题目简介 思路 AC代码 方法一:字符串蛮力 方法二:二进制枚举 方法三:DFS 三.2闫老板思考角度 方法四:全 ...

  3. 蛮力法在求解最优解问题中的应用(JAVA)--旅行家问题、背包问题、分配问题

    蛮力法在求解最优解问题中的应用 1.TSP(旅行商问题)要求我们找出一条n个给定城市之间的最短路径,使我们再回到出发的城市之前,对欧每个城市都只访问一次.我们可以用赋权图来描述这个问题,那么算法的目的 ...

  4. 分枝定界法解0/1背包问题

    分枝定界法解0/1背包问题 关键词:分支定界.0-1背包 分枝定界法简介 分枝定界法按照树形结构来组织解空间,展开节点后,有两种策略: 策略一.把节点加入 FIFO 队列当中: 策略二.把节点加入到堆 ...

  5. 回溯法 —— 求解0/1背包问题(剪枝)

    0/1背包问题 题目描述: 有n个重量分别为w1,w2,-,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,-,vn,给定一个容量为W的背包.设计从这些物品中选取一部分物品放入该背包的方案 ...

  6. 分枝限界法求解0/1背包问题

    问题描述 有n个重量分别为{w1,w2,-,wn}的物品,它们的价值分别为{v1,v2,-,vn},给定一个容量为W的背包. 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中 ...

  7. 动态规划法改进:用序偶法求0/1背包问题

    动态规划法改进:用序偶法求0/1背包问题 1.问题 2.方法 3.实现代码 序偶法求0/1背包问题(动态规划法改进版) by 孙琨SealSun at UCAS 2015.11.20 #include ...

  8. 蛮力法求最大字段和时间复杂度_蛮力法

    蛮力法的主要思想就是用最简单的思路解决问题,一般性能不好,但仍然很重要. 理论上蛮力法可以解决可计算领域的各种问题 蛮力法解决较小规模问题是可接受的,如果设计一个更高效算法代价不值得 蛮力法可以作为时 ...

  9. 蛮力法的相关问题总结

    今天想写写关于蛮力法的一些问题,也给之后自己留下一个笔记. 蛮力法关键------依次处理所有元素 1.查找问题中的蛮力法 顺序查找 int SeqSearch(int r[],int n,int k ...

最新文章

  1. 2021年大数据Flink(十三):流批一体API Sink
  2. ZeroCopyLiteralByteString cannot access superclass
  3. iOS SEL类型和创建
  4. the next journal submission for mechanism should be at this journal
  5. 网上邻居访问提示未授予用户在此计算机上的请求登录类型的解决
  6. 外媒:高通、微软和谷歌担忧英伟达收购Arm将损害竞争
  7. 玩转 SpringBoot 2 之整合 JWT 下篇
  8. Silverlight AutoCompleteBox(自动完成输入框控件)使用方法
  9. Win10找回自带的Windows照片查看器:打开jpg、png、gif格式的图片
  10. 案例:微博传播引爆点
  11. 再梳理一下seqtoseq,encoder-decoder,attention,transformer的概念
  12. Activity生命周期走向分析
  13. 菜鸟写Python-Scrapy:Spider源码分析
  14. python获取pdf页数_Python分割指定页数的pdf文件方法
  15. dataguard配置及数据测试
  16. 整理了几个经常访问的Qt知名社区
  17. matlab里面的sul,MATLAB语言在电机控制系统仿真研究中的应用
  18. 各类3D建模格式转换gltf格式【来源一个建模APP客户问题解决】
  19. 4.1.7 OS之文件共享(索引节点-硬链接、符号链接-软链接)
  20. Django上传并显示图片

热门文章

  1. jquery让html页面空白页,jquery实现点击页面空白隐藏指定菜单
  2. BDTC 2017 | 区块链论坛:华东师范、中科院、趣链、人民大学、人民保险专家共话区块链的现状和未来...
  3. 百度超级链作为中国唯一企业代表出席WTO论坛,携手国际领袖制定全球区块链标准...
  4. 'internalField' 和'boundaryField'的区别?【翻译】
  5. python123.io作业_python成长之路-----day1-----作业(登录程序和三级菜单)
  6. 涉及计算机控制的课题,长春理工大学电子教案-计算机控制系统 第1章 绪论
  7. 西北农林科技大学linux实验报告,西北农林科技大学 linux考试复习提纲
  8. 软件工程工作量评估中的ILF,EIF,EI,EO,EQ术语解释
  9. 华为mate10可以用鸿蒙吗,可升级到鸿蒙2.0的四款华为手机,在用的恭喜了
  10. 浅谈:为什么vue和react都选择了Hooks?