回溯应用-- 0-1背包问题

文章目录

    • 1. 问题描述
    • 2. 回溯解决思路

1. 问题描述

0-1背包非常经典,很多场景都可以抽象成这个问题。经典解法是动态规划,回溯简单但没有那么高效。

  • 有一个背包,背包总的承载重量是 W kg。现有n个物品,每个物品重量不等,并且不可分割。
  • 选择几件物品,装到背包中。在不超过背包所能装载重量的前提下,如何让背包中物品总重量最大?
  • 物品是不可分割的,要么装要么不装,所以叫 0-1背包问题。

2. 回溯解决思路

  • 对于每个物品来说,都有两种选择,装进背包或者不装进背包。
  • 对于n个物品来说,总的装法就有 2n 种,去掉总重量超过 W kg的,从剩下的装法中选择总重量最接近 W kg的。不过,我们如何才能不重复地穷举出这 2n 种装法呢?

可以用回溯方法。

  • 把物品依次排列,整个问题就分解为了n个阶段,每个阶段对应一个物品怎么选择。
  • 先对第一个物品进行处理,选择装进去或者不装进去,然后再递归地处理剩下的物品。
  • 当发现已经选择的物品的重量超过 W kg之后,就停止继续探测剩下的物品(搜索剪枝技巧)。
/*** @description: 0-1背包--回溯应用* @author: michael ming* @date: 2019/7/9 1:13* @modified by: */
#include <iostream>
#define MaxWeight 76   //背包承载极限
using namespace std;
void fill(int i, int curWeight, int *bag, int N, int &maxweightinbag)
{if(curWeight == MaxWeight || i == N)//到达极限了,或者考察完所有物品了{if(curWeight > maxweightinbag)maxweightinbag = curWeight;//记录历史最大装载量return;}fill(i+1,curWeight,bag,N,maxweightinbag);//不选择当前i物品,cw不更新if(curWeight+bag[i] <= MaxWeight)//选择当前i物品,cw更新{//没有达到极限,继续装fill(i+1,curWeight+bag[i],bag,N,maxweightinbag);}
}
int main()
{const int N = 4;int bag[N] = {15,6,40,21};
//    int bag[N] = {1,2,3,4};int maxweightinbag = 0;fill(0,0,bag,N,maxweightinbag);cout << "最大可装进背包的重量是:" << maxweightinbag;return 0;
}

升级版:
每个物品对应着一种价值,求不超过背包载重极限,可装入背包的最大总价值。(在上面程序里稍加修改即可)

/*** @description: * @author: michael ming* @date: 2019/7/11 20:42* @modified by: */#include <iostream>
#define MaxWeight 50   //背包承载极限
using namespace std;
void fill(int i, int curWeight, int curValue, int *bag,int *value, int N, int &weightinbag, int &maxValue)
{if(curWeight == MaxWeight || i == N)//到达极限了,或者考察完所有物品了{if(curValue > maxValue){maxValue = curValue;//记录历史最大价值weightinbag = curWeight;//记录最大价值对应的重量}return;}fill(i+1,curWeight,curValue,bag,value,N,weightinbag,maxValue);//不选择当前i物品,cw,cv不更新if(curWeight+bag[i] <= MaxWeight)//选择当前i物品,cw,cv更新{//没有达到极限,继续装fill(i+1,curWeight+bag[i],curValue+value[i],bag,value,N,weightinbag,maxValue);}
}
int main()
{const int N = 4;int bag[N] = {15,6,40,21};int value[N] = {1,2,3,4};int weightinbag = 0, maxValue = 0;fill(0,0,0,bag,value,N,weightinbag,maxValue);cout << "最大可装进背包的最大价值是:" << maxValue<< " ,对应重量是: " << weightinbag;return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java多线程系列(五):线程池的实现原理、优点与风险、以及四种线程池实现

为什么需要线程池 我们有两种常见的创建线程的方法&#xff0c;一种是继承Thread类&#xff0c;一种是实现Runnable的接口&#xff0c;Thread类其实也是实现了Runnable接口。但是我们创建这两种线程在运行结束后都会被虚拟机销毁&#xff0c;如果线程数量多的话&#xff0c;频繁…

论文浅尝 | 面向单关系事实问题的中文问答模型

来源&#xff1a;NLPCC 2017论文下载地址&#xff1a;http://tcci.ccf.org.cn/conference/2017/papers/2003.pdf动机开放领域的QA问题是一个被广泛研究的问题&#xff0c;而且目前这个问题并没有被很好地解决。在中文领域&#xff0c;相关的数据集并不多。而NLPCC开放了一个KBQ…

玩转算法值面试-第五章 -在链表中穿针引线

5-123 数组中可以随机访问&#xff0c;相反链表就不行 leetcode&#xff1a;206 反转一个链表&#xff0c;链表如果没有特别声明&#xff0c;则节点的值不发生改变 一共需要三个指针&#xff1a;current指向当前需要处理的指针 next指向当前需要处理的元素的下一个元素的指针…

论文笔记(SocialGCN: An Efficient Graph Convolutional Network based Model for Social Recommendation)

一个有效的基于图卷积神经网络的社交推荐模型 原文链接&#xff1a;SocialGCN: An Efficient Graph Convolutional Network based Model for Social Recommendation, arxiv 原理&#xff1a;在用户-项交互图上应用GNN来学习用户向量的表示&#xff0c;用户向量和项向量内积预测…

POJ 1753 Flip Game(回溯)

文章目录1. 题目1.1 题目链接1.2 题目大意1.3 解题思路2. 代码2.1 Wrong Answer代码2.2 Accepted代码1. 题目 1.1 题目链接 http://poj.org/problem?id1753 1.2 题目大意 一个黑白棋子的棋盘&#xff0c;一个反过来周围四个也跟着反过来(如果存在的话)&#xff0c;颜色取反…

他读书时挣了五十万,找工作时收获阿里腾讯快手等ssp offer

今天介绍一位dalao&#xff0c;他之前在中科院获取了计算机硕士学位&#xff0c;现在是一名大厂的算法工程师。大多数人的学生生活&#xff0c;是在枯燥的课程和任务中度过的&#xff0c;但他却有所不同&#xff0c;乐于折腾&#xff0c;收获了不一样的精彩。他喜欢去公司实习&…

Java多线程系列(三):Java线程池的使用方式,及核心运行原理

之前谈过多线程相关的4种常用Java线程锁的特点&#xff0c;性能比较、使用场景&#xff0c;今天主要分享线程池相关的内容&#xff0c;这些都是属于Java面试的必考点。 为什么需要线程池 java中为了提高并发度&#xff0c;可以使用多线程共同执行,但是如果有大量线程短时间之内…

论文浅尝 | 图神经网络综述:方法及应用

论文链接&#xff1a;https://arxiv.org/pdf/1812.08434.pdfGNN相关论文列表链接&#xff1a;https://github.com/thunlp/GNNPapers近日&#xff0c;清华刘知远老师组在arXiv上发表了一篇关于图神经网络的综述&#xff0c;本次论文浅尝在分享这篇论文的基础上&#xff0c;对图神…

论文笔记(Social Attentional Memory Network:Modeling Aspect- and Friend-level Differences in Recom-)

社交注意记忆网络&#xff1a;模拟面级别和朋友级别的区别 原文链接&#xff1a;Social Attentional Memory Network: Modeling Aspect- and Friend-Level Differences in Recommendation, WSDM’19 1. 摘要 社会中的连接有助于提升推荐系统的性能&#xff0c;但是&#xff…

玩转算法之面试-第六章(栈和队列)

leetcode 20 此时栈顶的左括号和当前遍历的右括号匹配&#xff0c;故将左括号从栈顶pop出。 leetcode 150&#xff1a; leetcode 71 栈和递归的关系 递归算法&#xff1a;二叉树中的算法 、二叉树的前序遍历&#xff0c;中序遍历&#xff0c;后序遍历 前序遍历代码&am…

POJ 1321 棋盘问题(回溯)

文章目录1. 题目1.1 题目链接1.2 题目大意1.3 解题思路2. 代码2.1 Accepted 代码1. 题目 1.1 题目链接 http://poj.org/problem?id1321 1.2 题目大意 在一个给定形状的棋盘&#xff08;只能在#号的位置摆放&#xff09;上面摆放棋子&#xff0c;棋子没有区别。要求摆放时任…

Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

在Java面试的时候&#xff0c;经常会问到Java并发编程相关的多线程、线程池、线程锁、线程通信等面试必考点&#xff0c;比如&#xff1a; Java并发编程系列&#xff1a;Java线程池的使用方式&#xff0c;核心运行原理、以及注意事项 Java并发编程系列&#xff1a;4种常用Jav…

负样本为王:评Facebook的向量召回算法

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术有人的地方就会有江湖&#xff0c;就会有鄙视链存在&#xff0c;推荐系统中也不例外。排序、召回&#xff0c;尽管只是革命分工不同&#xff0c;但是我感觉待遇还是相差蛮大的排序排序&#xff0c;特别是精排…

论文浅尝 | TEQUILA: 一种面向时间信息的知识问答方法

来源&#xff1a;CIKM’18链接&#xff1a;http://delivery.acm.org/10.1145/3270000/3269247/p1807-jia.pdf?ip223.3.116.39&id3269247&accACTIVE%20SERVICE&keyBF85BBA5741FDC6E%2EEEBE655830483280%2E4D4702B0C3E38B35%2E4D4702B0C3E38B35&__acm__15478819…

京东2020算法工程师0824笔试题整理

代码题&#xff1a; 1&#xff1a;开心消消乐&#xff1a; #include #include #include #include #include #include #include #define ll long long #define inf 0x3f3f3f3f #define Max 1001 using namespace std; int dir[4][2]{{-1,0},{1,0},{0,-1},{0,1}}; string …

论文笔记(eTrust: Understanding Trust Evolution in an Online World)

eTrust&#xff1a;理解线上信任进化 原文链接&#xff1a;eTrust: Understanding Trust Evolution in an Online World, KDD’12 原理&#xff1a;用户偏好与项的向量内积 用户与朋友相似度权重*朋友对项的时间衰减评分用户对项的评分 摘要 大部分关于线上信任的研究都假设…

技术动态 | 67 亿美金搞个图,创建知识图谱的成本有多高你知道吗?

OpenKG 祝各位读者元宵节快乐&#xff01;本文转载自公众号&#xff1a;机器之心。选自ISWC作者&#xff1a;Baptiste Rocca参与&#xff1a;思源、李亚洲我们知道强大的深度模型需要很多计算力&#xff0c;那你知道创建一个知识图谱的成本到底是多少吗&#xff1f;德国 Mannhe…

Attention模型:我的注意力跟你们人类不一样

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 小轶背景截至今日&#xff0c;Badanau Attention的原文citation已达1.34w之多。2020年几乎所有主流NLP任务都需要借助attetion来实现。在深度学习全民炼丹的时代&#xff0c;attention是为数不多具有较强…

动态规划算法(Dynamic Programming)之0-1背包问题

文章目录1. 问题引入2. 动态规划求解0-1背包3. 复杂度4. 0-1背包升级版&#xff08;带价值&#xff09;5. 0-1背包升级版&#xff08;带价值&#xff09;DP解法1. 问题引入 前面讲了0-1背包的回溯解决方法&#xff0c;它是穷举所有可能&#xff0c;复杂度是指数级别的&#xf…

Java多线程系列(一):最全面的Java多线程学习概述

Java并发编程的技能基本涵括以下5方面&#xff1a; 多线程 线程池 线程锁 并发工具类 并发容器 多线程的4种创建方式 继承Thread 实现Runnable接口 实现Callable接口 以及线程池来创建线程 Java线程的生命周期 线程的创建 线程的就绪 线程的运行 线程的阻塞 线程的死…