分支限界

分支界定是一种在问题的解空间树上搜索问题的解的方法,其实就是剪枝广搜,它始终维护一个上下界用来剪枝,一个限界函数计算对解的最有期望。主要用于解决离散问题的优化。


分支界定的关键问题:

(1)如何确定合适的限界函数

(2)如何组织待处理节点表

(3)如何记录最优解路径


限界函数应该是经过该节点所有搜索路径的最佳期望


最大问题:本质还是广搜,复杂度肯定不低,2^n的节点空间也受不了,试着解决01背包超时又超存,肯定不如DP,也可以解决TSP,排线问题等,


下边自己写的一个01背包,问题一堆,哎,菜鸟一个....

http://acm.hdu.edu.cn/showproblem.php?pid=2602

 

  1 #include<stdio.h>
  2 #include<queue>
  3 #include<algorithm>
  4 
  5 using namespace std;
  6 
  7 #define MAXN 1005
  8 
  9 struct ITEM
 10 {
 11     int w,v;
 12 }b[MAXN];
 13 
 14 struct NODE
 15 {
 16     int w,v,ve,pos;
 17 
 18     bool operator < (const NODE & other)const
 19     {
 20         return ve < other.ve;
 21     }
 22 };
 23 
 24 int search(ITEM * b,int num,int vol);
 25 int cmp(const void * a,const void * b);
 26 int expect(NODE a,ITEM * b,int num);
 27 
 28 int main()
 29 {
 30     //freopen("Sample Input.txt","r",stdin);
 31     int caseNum;
 32     scanf("%d",&caseNum);
 33 
 34     while(caseNum--)
 35     {
 36         int vol,num;
 37         scanf("%d%d",&num,&vol);
 38 
 39         for(int i = 0;i < num;i++)
 40         {
 41             scanf("%d",&b[i].v);
 42         }
 43         for(int i = 0;i < num;i++)
 44         {
 45             scanf("%d",&b[i].w);
 46         }
 47 
 48         printf("%d\n",search(b,num,vol));
 49     }
 50 }
 51 
 52 int search(ITEM * b,int num,int vol)
 53 {
 54     qsort(b,num,sizeof(b[0]),cmp);
 55 
 56     /*for(int i = 0;i < num;i++)
 57     {
 58         printf("%d %d\n",b[i].w,b[i].v);
 59     }*/
 60 
 61     int min = 0;                        //贪心的一个最小界
 62     int t = vol;
 63     for(int i = 0;i < num;i++)
 64     {
 65         if(t >= b[i].w)
 66         {
 67             min += b[i].v;
 68             t -= b[i].w;
 69         }
 70     }
 71     /*printf("%d %d\n",vol,min);*/
 72     priority_queue<NODE> que;
 73     
 74     NODE fir;
 75     fir.v = 0;
 76     fir.w = vol;
 77     fir.pos = 0;
 78     fir.ve = expect(fir,b,num);
 79     que.push(fir);
 80 
 81     while(!que.empty())
 82     {
 83         NODE cur = que.top();
 84         que.pop();
 85 
 86         if(cur.pos == num)
 87         {
 88             return cur.v;
 89         }
 90 
 91         for(int i = 0;i <= 1;i++)
 92         {
 93             NODE next = cur;
 94             if(i == 1 && next.w < b[cur.pos].w)
 95             {
 96                 continue;
 97             }
 98             next.w -= (i * b[cur.pos].w);
 99             next.v += (i * b[cur.pos].v);
100             next.pos++;
101             next.ve = expect(next,b,num);
102 
103             if(next.pos == num && next.v > min)
104             {
105                 min = next.v;
106             }
107             if(next.ve >= min)
108             {
109                 que.push(next);
110             }
111         }
112     }
113 }
114 
115 int cmp(const void * a,const void * b)
116 {
117     double rate_a = double(((ITEM *) a) -> v) / ((ITEM *) a) -> w;
118     double rate_b = double(((ITEM *) b) -> v) / ((ITEM *) b) -> w;
119     return rate_b - rate_a;
120 }
121 
122 int expect(NODE a,ITEM * b,int num)                        //限界函数
123 {
124     if(a.pos == num)
125     {
126         return a.v;
127     }
128     else
129     {
130         return a.v + a.w * b[a.pos].v / b[a.pos].w;
131     }
132 }

 

转载于:https://www.cnblogs.com/codingMozart/p/6439743.html

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

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

相关文章

mysql表变量临时表_表变量和临时表详解

首先让我们来看看什么是表变量和临时表。sql server 表变量1.初识表变量表变量在sql server 2000中首次被引用。表变量的定义和创建一个表大致相同&#xff0c;只不过是使用DECLARE variable而不是CREATE Table&#xff0c;表变量定义包括列定义&#xff0c;列名&#xff0c;数…

SWT外观:自定义FlatScrollBar颜色等

最近&#xff0c;我引入了一个自定义滑块控件 &#xff0c;该控件可用于改善SWT外观和更细微的视图布局的感觉。 令人高兴的是&#xff0c;该小部件似乎已经在Code Affine世界之外找到了较早的采用者 。 这导致了一些增强 &#xff0c;这些增强将在以下各节中介绍。 SWT滚动条…

类的静态数据成员

有时需要为某个类的所有对象分配一个单一的存储空间。在C语言中&#xff0c;可以用全局变量&#xff0c; 但这样很不安全。全局数据可以被任何人修改&#xff0c;而且&#xff0c;在一个项目中&#xff0c;它很容易与其他的名字 相冲突。如果可以把一个数据当成全局变量那样去存…

【Android 13】使用Android Studio调试系统应用之Settings移植(三):构建settingsLib项目目录

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、AS新建SettingsLib New Moudle3.1 创建 New Moudle3.2 替换源文件(1)选定复制目标(2)复制到AS目录,并改名(3)完成创建四、下一步动作五、篇尾

java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...

前言简介前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译你的代码的本文不是从最底层的编译原理讲解本文是针对java代码,去查看归纳总结编译…

提高性能:流的非阻塞处理

1.简介 想象一下&#xff0c;我们有一个需要访问外部Web服务的应用程序&#xff0c;以便收集有关客户端的信息&#xff0c;然后对其进行处理。 更具体地说&#xff0c;我们无法在一次调用中获得所有这些信息。 如果我们要查找不同的客户端&#xff0c;则需要多次调用。 如下图…

通过NAT转发实现私网对外发布信息

我们可以在防火墙的外部网卡上绑定多个合法IP地址&#xff0c;然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上&#xff0c;然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。具体的IP分配如下&#xff1a; &#xff08;1&#xff09;该ISP分配…

java支付管理有源码_java支付宝支付案例源码

【实例简介】※运行环境※Eclipse JDK1.6及以上 Tomcat6.0及以上※使用方法※SDK下载地址&#xff1a;https://doc.open.alipay.com/docs/doc.htm?treeId193&articleId103419&docType1第一步&#xff1b;请下载【JAVA版资源】的SDK。第二步&#xff1a;下载完毕后&…

CDI和EJB:在事务成功时发送异步邮件

再一次问好&#xff01; :) 这次&#xff0c;我选择了一项常见任务&#xff0c;我认为大多数情况下都以错误的方式完成&#xff1a;发送电子邮件。 并非所有人都不知道电子邮件API的工作方式&#xff0c;例如JavaMail或Apache的commons-email 。 我通常看到的一个问题是&#…

SPFILE 、PFILE 的全面解读

这里先阐述一下数据库的启动过程&#xff1a; 1. 启动实例/例程&#xff08;nomount状态&#xff09;时&#xff0c;读取参数文件(文本文件PFILE 或服务器参数文件SPFILE)&#xff0c;分配SGA、启动后台进程、打开告警文件及后台进程跟踪文件&#xff1b; 2. 装载数据…

JAVA确定这天是这年的某一天_[Java] 练习题014: 输入某年某月某日,判断这一天是这一年的第几天?...

import java.util.*;public class Test014{public static void main(String[] args) throws Exception{int y,m,d;int sum0;int feb28;Scanner in new Scanner(System.in);System.out.print("请输入年份:");y in.nextInt();System.out.print("请输入月份:&quo…

使用默认方法的界面演变–第一部分:方法

几周前&#xff0c;我们详细研究了默认方法 -Java 8中引入的一项功能&#xff0c;该功能允许为接口方法提供实现&#xff0c;即方法主体&#xff0c;从而定义接口中的行为。 引入此功能是为了实现接口演进 。 在JDK的上下文中&#xff0c;这意味着在不破坏所有代码的情况下向接…

java左手握右手_环保型燃料—丙烷(C3H8)曾用于北京奥运会“祥云”火炬燃料,下列有关烷烃的说法不正确的是()A.丙烷分子中三个...

参考答案如下环保会祥【单选题】环境景观设计的核心就是以研究()为基础。型燃下列【判断题】构成中央处理器的两大部件是运算器和存储器。料丙料【单选题】通过下列哪种方式可以获得最强的免疫效果【单选题】根据断面图的标注形式&#xff0c;烷C烷烃下列绘制规范的断面图是【单…

windbg script ---- 禁用IsDebuggerPresent

简单的script r $t0 kernelBase!IsDebuggerPresent; eb $t00x9 31 c0 90 90强制把原代码改成xor eax, eax; nop; nop 注意在xp下&#xff0c;使用kernel32 转载于:https://www.cnblogs.com/hgy413/p/3693400.html

java两个和三个_Java语言基础(day_03)

数据类型中补充的几个小问题1)在定义Long或者Float类型变量的时候&#xff0c;要加L或者f。整数默认是int类型&#xff0c;浮点数默认晨double。byte&#xff0c;short在定义的肘候&#xff0c;他们接收的某实是一个int类型的值。这个是自己做了一个数据检测的&#xff0c;如果…

Hibernate中的JPA 2.1条件删除/更新和临时表

从JPA 2.0版开始&#xff0c; EntityManager提供了方法getCriteriaBuilder()来动态构建选择查询&#xff0c;而无需使用Java持久性查询语言&#xff08;JPQL&#xff09;进行字符串连接。 在2.1版中&#xff0c;此CriteriaBuilder提供了两个新方法createCriteriaDelete()和crea…

使用Hamcrest增强JUnit的测试能力

package com.jadyer.service;import java.util.HashMap; import java.util.Map;import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test;/*** 使用Hamcrest增强JUnit的测试能力* see Hamcrest框架提供了一些相对通俗并高效的方法来进行一些junit比较困…

在Websphere 8.0上安装Liferay 6.2 Enterprise Edition

为Liferay准备Websphere 当应用服务器二进制文件均已安装完毕&#xff0c;启动WebSphere应用服务器&#xff08;WAS&#xff09; 配置文件管理工具来创建一个配置文件适用于Liferay的和遵循的指示说明这里正式Liferay的文档。 这些说明用于在Websphere 8.5上安装Liferay 6.2&am…

java完数流程图_编程基本功训练:流程图画法及练习

对于“程序设计”的工作&#xff0c;许多初学者的理解就是“写代码”。同样&#xff0c;新手们苦恼的问题是&#xff0c;他们只会“写代码”。当接到一个新的任务&#xff0c;不少人总是在第一时间就爬到键盘上去敲代码。敲着敲着&#xff0c;就把自己绕糊涂了。头晕脑胀地坚持…

iOS modal view的关闭和显示问题

今天遇到一个问题&#xff1a; 需要关闭当前modal view&#xff0c;再present另一个modal view。 如果这么写&#xff1a; [self dismissModalViewControllerAnimated:NO];[self.delegate showBorderDetectionView];执行了第一句&#xff0c;再执行第二句的时候&#xff0c;sel…