二、穷举搜索法

穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从众找出那些符合要求的候选解作为问题的解。

【问题】   ABCDEF这六个变量排成如图所示的三角形,这六个变量分别取[16]上的整数,且均不相同。求使三角形三条边上的变量之和相等的全部解。如图就是一个解。

程序引入变量abcdef,并让它们分别顺序取16的证书,在它们互不相同的条件下,测试由它们排成的如图所示的三角形三条边上的变量之和是否相等,如相等即为一种满足要求的排列,把它们输出。当这些变量取尽所有的组合后,程序就可得到全部可能的解。细节见下面的程序。

【程序1

# include <stdio.h>

void main()

{   int a,b,c,d,e,f;

  for (a=1;a<=6;a++)  

    for (b=1;b<=6;b++)     {

      if (b==a)     continue;

      for (c=1;c<=6;c++)     {

        if (c==a)||(c==b)   continue;

        for (d=1;d<=6;d++)     {

          if (d==a)||(d==b)||(d==c)   continue;

for (e=1;e<=6;e++)     {

  if (e==a)||(e==b)||(e==c)||(e==d)   continue;

f=21-(a+b+c+d+e);

if ((a+b+c==c+d+e))&&(a+b+c==e+f+a))   {

printf(“%6d,a);

  printf(“%4d%4d”,b,f);

  printf(“%2d%4d%4d”,c,d,e);

  scanf(“%*c”);

}

            }

          }

        }

      }

    }

按穷举法编写的程序通常不能适应变化的情况。如问题改成有9个变量排成三角形,每条边有4个变量的情况,程序的循环重数就要相应改变。

  对一组数穷尽所有排列,还有更直接的方法。将一个排列看作一个长整数,则所有排列对应着一组整数。将这组整数按从小到大的顺序排列排成一个整数,从对应最小的整数开始。按数列的递增顺序逐一列举每个排列对应的每个整数,这能更有效地完成排列的穷举。从一个排列找出对应数列的下一个排列可在当前排列的基础上作部分调整来实现。倘若当前排列为124653,并令其对应的长整数为124653。要寻找比长整数124653更大的排列,可从该排列的最后一个数字顺序向前逐位考察,当发现排列中的某个数字比它前一个数字大时,如本例中的6比它的前一位数字4大,这说明还有对应更大整数的排列。但为了顺序从小到大列举出所有的排列,不能立即调整得太大,如本例中将数字6与数字4交换得到的排列126453就不是排列124653的下一个排列。为了得到排列124653的下一个排列,应从已经考察过的那部分数字中选出比数字大,但又是它们中最小的那一个数字,比如数字5,与数字4交换。该数字也是从后向前考察过程中第一个比4大的数字。54交换后,得到排列125643。在前面数字125固定的情况下,还应选择对应最小整数的那个排列,为此还需将后面那部分数字的排列顺序颠倒,如将数字643的排列顺序颠倒,得到排列125346,这才是排列124653的下一个排列。按以上想法编写的程序如下。

【程序2

# include <stdio.h>

# define SIDE_N   3

# define LENGTH   3

# define VARIABLES   6

int A,B,C,D,E,F;

int *pt[]={&A,&B,&C,&D,&E,&F};

int *side[SIDE_N][LENGTH]={&A,&B,&C,&C,&D,&E,&E,&F,&A};

int side_total[SIDE_N];

main{}

{   int i,j,t,equal;

  for (j=0;j<VARIABLES;j++)

    *pt[j]=j+1;

  while(1)

  {   for (i=0;i<SIDE_N;i++)

    {   for (t=j=0;j<LENGTH;j++)

        t+=*side[j];

      side_total=t;

    }

    for (equal=1,i=0;equal&&i<SIDE_N-1;i++)

      if (side_total!=side_total[i+1]   equal=0;

    if (equal)

    {   for (i=1;i<VARIABLES;i++)

        printf(“%4d”,*pt);

      printf(“\n”);

      scanf(“%*c”);

    }

    for (j=VARIABLES-1;j>0;j--)

      if (*pt[j]>*pt[j-1])   break;

    if (j==0)   break;

    for (i=VARIABLES-1;i>=j;i--)

      if (*pt>*pt[i-1])   break;

    t=*pt[j-1];* pt[j-1] =* pt; *pt=t;

    for (i=VARIABLES-1;i>j;i--,j++)

    {   t=*pt[j]; *pt[j] =* pt; *pt=t;   }

  }

}

从上述问题解决的方法中,最重要的因素就是确定某种方法来确定所有的候选解。下面再用一个示例来加以说明。

【问题】   背包问题

问题描述:有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。

n个物品的重量和价值分别存储于数组w[ ]v[ ]中,限制重量为tw。考虑一个n元组(x0x1,…,xn-1),其中xi=0 表示第i个物品没有选取,而xi=1则表示第i个物品被选取。显然这个n元组等价于一个选择方案。用枚举法解决背包问题,需要枚举所有的选取方案,而根据上述方法,我们只要枚举所有的n元组,就可以得到问题的解。

显然,每个分量取值为01n元组的个数共为2n个。而每个n元组其实对应了一个长度为n的二进制数,且这些二进制数的取值范围为02n-1。因此,如果把02n-1分别转化为相应的二进制数,则可以得到我们所需要的2nn元组。

【算法】

maxv=0;

for (i=0;i<2n;i++)

{   B[0..n-1]=0;

  i转化为二进制数,存储于数组B;

  temp_w=0;

  temp_v=0;

  for (j=0;j<n;j++)

  {   if (B[j]==1)

    {   temp_w=temp_w+w[j];

      temp_v=temp_v+v[j];

    }

    if ((temp_w<=tw)&&(temp_v>maxv))

    {   maxv=temp_v;

      保存该B数组;

    }

  }

}

 

转载于:https://www.cnblogs.com/baoguo/articles/826805.html

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

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

相关文章

恢复Ext3下被删除的文件

下面是这个教程将教你如何在Ext3的文件系统中恢复被rm掉的文件。假设我们有一个文件名叫 ‘test.txt’$ls -il test.txt15 -rw-rw-r– 2 root root 20 Apr 17 12:08 test.txt注意&#xff1a;: “-il” 选项表示显示文件的i-node号&#xff08;15&#xff09;&#xff0c;如果你…

WPF 表格控件 ReoGrid 的简单使用

WPF 表格控件 ReoGrid 的简单使用目录一、概述二、安装三、添加控件四、加载 Excel五、属性设置六、支持触摸滚动七、其它操作1、显示和隐藏列2、显示特定字体八、资源链接独立观察员 2021 年 7 月 9 日一、概述ReoGrid 是一个开源的表格控件库&#xff0c;支持 Winform 和 WPF…

史上最牛空姐,从飞机上掉下愣是没摔死

全世界只有3.14 % 的人关注了青少年数学之旅珠穆朗玛峰最新的测量高度为8844米&#xff0c;人是血肉之躯&#xff0c;一旦从这么高的地方掉下来&#xff0c;别说生还了&#xff0c;能有个全尸就不错了。但是&#xff0c;历史上却有这么以为超级幸运的女人&#xff0c;她从比珠穆…

mysql主主同步冲突_MySQL主主同步主键冲突处理

两台数据库都报slave同步失败了&#xff0c;先说明一下环境&#xff0c;架构&#xff1a;lvskeepalivedamoebamysql&#xff0c;主主复制&#xff0c;单台写入&#xff0c;主1:192.168.0.223(写)主2:192.168.0.230好吧&#xff0c;先show slave status \G看一下同步失败的具体报…

[未来的购碟指南]送给那些以后想收藏真人电影DVD的菜鸟们

随着真人电影在全世界的上映&#xff0c;全世界又掀起了一股新的TF热。对于我们这些铁杆FANS来说&#xff0c;除了肯定要去电影院观影之外&#xff0c;肯定还要收藏一张这部电影的DVD&#xff0c;以达到圆满。本人从2002年开始收藏各种DVD&#xff0c;因此这几年中&#xff0c;…

来聊聊正则表达式

概念正则表达式 是一种匹配输入文本的模式。.Net框架提供了允许这种匹配的正则表达式引擎。模式由一个或多个字符、运算符和结构组成。Regex 类Regex 类用于表示一个正则表达式。下表列出了 Regex 类中一些常用的方法&#xff1a;1 public bool IsMatch( string input ) 指示 R…

nginx对websocket的支持及uliweb chatroom的测试

2019独角兽企业重金招聘Python工程师标准>>> 在尝试在uliweb中使用gevent开发聊天室时&#xff0c;已经在网上搜到nginx是支持websocket的代理的&#xff0c;不过应该不支持集群模式。不过当时没有试过&#xff0c;今天试了一下&#xff0c;在普通的反向代理是没有问…

为什么祖国没有农历生日? | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅假期计划路线所以为什么没有农历生日所以这个到底是什么字&#xff1f;身体不适&#xff0c;去了趟医院那医生怎么说&#xff1f;......你还敢说养我吗&#xff1f;&#xff08;图源网络&#xff0c;侵权删&#xff09;

ios中amplify配置configure_Nginx源码编译安装及配置文件初步学习

通过源码编译安装。nginx.org #官网地址 # 安装过程 wget http://nginx.org/download/nginx-1.18.0.tar.gz -P /usr/src # tar文件用tar命令解压 tar -zxvf nginx-1.18.0.tar.gz关于wget的-P参数&#xff0c;manual中的解释是prefix&#xff0c;Set directory prefix …

RFID会议签到系统总结(二十一)――服务端的通讯

<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />这一篇其实没什么可讲的&#xff0c;只提一下跟客户端不太一样的一些地方。 服务端跟客户端最大的区别是它面对的不是单单一个连接&#xff0c;而是有一些个连接。对于接收与发送…

演示: 动态NAT完成网络地址翻译

演示&#xff1a; 动态NAT完成网络地址翻译技术交流与答疑请加入群&#xff1a;1952289演示目标&#xff1a;使用动态NAT完成对私有网络的地址翻译。演示环境&#xff1a;如下图9.63所示。演示背景&#xff1a;该演示环境保持PAT演示环境的网络基础配置&#xff0c;然后使用动态…

.NET测试用例写的好不好?让变种来测试一下!

为了保证代码能够正常工作&#xff0c;我们常常编写了大量单元测试&#xff0c;并且代码覆盖率也做到了100%。但是在生产环境运行时还是会出问题&#xff01;为什么&#xff1f; 这是因为你没有进行变异测试&#xff01;变异测试变异测试就是把bug&#xff08;变种mutant&#…

你根本想象不到,学霸到底经历过什么

全世界只有3.14 % 的人关注了青少年数学之旅在微信的订阅号中&#xff0c;每人最多有12个常读公众号。可公众号这么多&#xff0c;哪些公众号值得关注呢&#xff1f;今天给大家推荐的几个公众号&#xff0c;不仅生产优质的时效性内容&#xff0c;还会提供各种多元化的内容角度&…

mysql重装远程服务未_MySQL远程连接丢失问题解决方法(Lost connection to MySQL server)...

最近服务器很不稳定&#xff0c;于是重装了mysql 和php 服务&#xff0c;但是接着却遇到了很头疼的麻烦。远程连接mysql是总是提示&#xff1a;Lost connection to MySQL server at ‘reading initial communication packet, system error: 0很明显这是连接初始化阶段就丢失了连…

买基金如何开户

开户主要有两种途径&#xff1a;&#xff08;1&#xff09;投资者通过深交所交易系统认购、买入或卖出上市开放式基金须使用深圳A股账户或深圳证券投资基金账户&#xff08;以下简称“深圳证券账户”&#xff09;。投资者可通过中国结算公司深圳分公司的开户代理机构&#xff0…

OpenStack开启亚洲之旅

11月5-8日&#xff0c;OpenStack峰会在中国香港亚洲国际博览馆举行。这是OpenStack峰会首次在北美地区之外举行&#xff0c;吸引了约3000名全球各地的企业、用户和开发者。中国已经是除美国以外OpenStack软件下载量和对社区贡献代码量第二大的地区。OpenStack峰会此次落户香港也…

历史上最怪异的23种飞行器,设计者脑子里都想什么了

全世界只有3.14 % 的人关注了青少年数学之旅历史的长河中有无数稀奇古怪&#xff08;呆萌&#xff09;的发明被无情淘汰&#xff0c;而飞行器的发明可谓人类探索道路上尤为浓烈的一笔&#xff0c;过去的110多年里&#xff0c;空中就曾出现以下23中古怪的飞行器。下面这张图比较…

NET问答: 如何让 HttpClient 支持 Http 2.0 协议?

咨询区 Justin Lessard&#xff1a;我的一个项目需要支持 Http 2.0 进行数据的收发&#xff0c;目前用的项目版本是 .NET Core 2.2&#xff0c;我选型了 HttpClient&#xff0c;但是我发现一个问题&#xff0c;在生产环境中的程序返回的 response 版本一直都是 Http 1.1&#x…

最近读的书与做的事

做的事情无非是Thesis当头&#xff0c;其他跟上。Axss的工作室站点&#xff0c;还有就是IAESTE项目的部分页面。读的书&#xff1a;《深入探索C/C》&#xff1a;搞清楚以前很多一知半解的概念《Game Programming Gem 3》&#xff1a;对我而言仍是太深了点&#xff0c;不过当作了…

从mysql读取图片_如何从sql数据库内读取图片

privatevoidSHOW(){MemoryStreamstreamnewMemoryStream();byte[]buffBytenull;stringsqlstr"selectRefFinImagefromRefTablewhereRefId5";//我要规定死读入第五张图片SqlConnectio...private void SHOW(){MemoryStream stream new MemoryStream();byte[] buffByte …