热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

回溯——(装载/0-1背包)

搜索篇之回溯(1)0-1背包装载o-1背包背包问题:已知一个容量大小为M重量的背包和N种物

搜索篇之回溯 
 

(1)
0-1背包/装载

o-1背包

背包问题 :
已知一个容量大小为 M 重量的背包和 N 种物品,每种物品的重量为 Wi 。若将物品放入背包将得到 Pi 的效益,求怎样选取物品将得到效益最大

   输入:第一行一个整数,为背包的容量M;第二行一个整数,为物品的种数N;第三行N个整数为各物品的重量;第四行N个整数分别为N个物品的价值

   输出:第一行为最大总价值;第二行为装入的各物品的重量(未装的物品用0);第三行为装入的各物品的价值(未装的物品用0)


输入样例:
 
50
 3
 10 20 30
 60 100 120
输出样例:
 
220
 0 20 30
 0 100 120


解题思路:

对于每种可能的情况,进行判断,看是否是最优解;即对于每件物品,可以选择放(背包容量限制内),或是不放(不放的情况分别是当前背包放不下了,和如果这个不放,后面的可能使得value更大。)。然后对下一个物品进行判断,


解空间:

bag:array[1..maxn]of 0..1;

其中,bag[k]=1表示第k个物品要取

           0表示第k个物品不取


( K 表示第K个物品;N表示物品的个数)

约束条件:

背包足以放下当前物品;


状态树:

Best:=0;   表示最大价值
当一组解产生后,得到当前总价值count,
if count>best then best:=count
利用这种方法记录最优解!如果还要记录最优时的物品取法应:
if count>best then begin
    best:=count;
    for i:=1 to n do y[i]:=bag[i];




结束条件:

所有的可用的解法都已经搜索完毕,即K>=N时;


求最优解步骤:

对于每一种可能的解法,都与当前最优解比较,进行更新。

即:在K>=N的时候将当前的值与最优解比较,即current_value与best比较。进行更新;


注意:

回溯过程中注意状态的回复。



当然,如果仅仅是这样的话,很容易实现,但是耗时很大。原因是进行了很多不必要的搜索,那么心在就是要来剪枝了。


上界函数:当前值+剩余的物品的值<=当前最优解best

当前值指的是第k 层之前的值,剩余物品的值指的是不包括当前物品,剩余的值


if(curp+r>best)
{
	plag[k]=0;
	fun(k+1);
}

       即 当这个物品不放置的时候,即使后面的都能放进去,得到的值也小于最优值的时候,以此节点后的子树就军事不可行解。可以不予判断(即舍弃这个子树)。


源代码:


# include
# include
# include

# define M 1000

int w[M+100],p[M+100];
char plag[M+100],bag[+200]; 	//标记数组 
int r,best,curw,curp;			//剩余值,最优值,当前重量,当前值 
int n,m;

int fun(int k)
{
	int i;
	if(k>=n)
	{
		if(curp>best)			//更新操作 
		{
			for(i=0;ibest)			// 剪状态树枝 
		{
			plag[k]=0;
			fun(k+1);
		}
		r+=p[k];
	}
	return 0; 
}

int main(){
	
	int i;
	while(~scanf("%d",&m))
	{
		scanf("%d",&n);
		for(i=0;i 
  


装载问题,与此类似。


装载问题






解空间:子集树
可行性约束函数(选择当前元素):
上界函数(不选择当前元素):

当前载重量cw+剩余集装箱的重量r£当前最优载重量bestw

voidbacktrack(inti)

   {// 搜索第i层结点

      if (i > n) // 到达叶结点

      更新最优解bestx,bestw;return;

      r -= w[i];

      if (cw + w[i] <= c) {// 搜索左子树

         x[i] = 1;

         cw += w[i];

         backtrack(i+ 1);

         cw -= w[i];     }

      if (cw + r > bestw) {

         x[i] = 0; // 搜索右子树

         backtrack(i+ 1);      }

      r += w[i];

   }




源代码:


# include
# include
# include
#define M 1000

int w[M+100];
int n,bestw,curw,r;
int c1,c2;
char plag[M+100],bag[M+100];	//位置标记, 

int fun(int k)
{
	int i;
	if(k>=n)
	{
		if(curw>bestw)
		{
			for(i=0;ibestw)	//上界函数(剪枝函数)  
		{
			plag[k]=0;
			fun(k+1);
		}
		r+=w[k];	//状态恢复 
	}
	return 0;
}

int main(){
	
	int i;
	while(~scanf("%d%d",&c1,&c2))
	{
		memset(plag,0,sizeof(plag));				
		scanf("%d",&n);
		for(i=0;i 
  
编辑于2015/2/13- 01:38



推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 本文讨论了同事工资打听的话题,包括同工不同酬现象、打探工资的途径、为什么打听别人的工资、职业的本质、商业价值与工资的关系,以及如何面对同事工资比自己高的情况和凸显自己的商业价值。故事中的阿巧发现同事的工资比自己高后感到不满,通过与老公、闺蜜交流和搜索相关关键词来寻求解决办法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何配置小米wifi放大器来增强家庭无线路由器信号?
    本文介绍了如何通过配置小米wifi放大器来增强家庭无线路由器信号的方法。通过打开米家APP,选择设备添加,搜索并选择需要添加的wifi放大器,根据系统提示进行下一步操作即可完成配置。配置完成后,家庭无线路由器信号将得到增强。 ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • 本文讨论了如何在不使用SearchBar display controller的情况下,单独使用SearchBar并捕获其textChange事件。作者介绍了实际状况,即左侧SliderMenu中的SearchBar需要在主页TableView中显示搜索结果。然后,作者提供了解决方案和步骤,帮助读者实现这一功能。 ... [详细]
  • 本文介绍了新款奇骏的两个让人上瘾的功能,分别是智能互联系统和BOSE音响。通过对新款奇骏的配置和功能进行评测,探讨了这两个新增功能的使用体验和优势。此外,还介绍了新款奇骏的其他配置和改进,如增加的座椅和驾驶辅助系统,以及内饰的舒适性提升。对于喜欢音响的消费者来说,BOSE音响的升级也是一个亮点。最后,文章提到了BOSE音响的数字还原能力,以及7座版无法配备BOSE音响的原因。 ... [详细]
  • 电脑公司win7剪切板位置及使用方法
    本文介绍了电脑公司win7剪切板的位置和使用方法。剪切板一般位于c:\windows\system32目录,程序名为clipbrd.exe。通过在搜索栏中输入cmd打开命令提示符窗口,并输入clip /?即可调用剪贴板查看器。赶紧来试试看吧!更多精彩文章请关注本站。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • Excel数据处理中的七个查询匹配函数详解
    本文介绍了Excel数据处理中的七个查询匹配函数,以vlookup函数为例进行了详细讲解。通过示例和语法解释,说明了vlookup函数的用法和参数的含义,帮助读者更好地理解和运用查询匹配函数进行数据处理。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
author-avatar
光明使者之快乐天使_101
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有