ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 27692|回复: 105

[讨论] 一道有趣的数字题目

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-7-3 23:34 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

男生女生各1000人,分别编号1-1000.现从1-1000中选取20个数字,比如:

1,2,3,4,5,6,7,14,21,28,35,42,49,56,63,70,77,84,91,98

选出以上编号的男生女生,异性之间的任两人号码相加,可得到400个有重复的数字。在这些数字中,连续数字最多可有多少?如本例最大可得到2-105共104个连续数字。

求选择这20个数字的最佳方案

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-3 23:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不难推算,

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 22, 33, 44, 55, 66, 77, 88, 99, 110---------->可得到  120个l连续数字

有没有更优的方案?

TA的精华主题

TA的得分主题

发表于 2017-7-4 07:38 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-7-4 08:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-7-5 18:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
选定20个数之后,检查连续数列这个比较容易一点。

所以,问题核心就在于如何选定20个数的间隔分布。

初步设想,先从较小的数(x<m)中取较少的n个数,模拟后检查是否存在浪费。(多余的数)
扣除多余的数,然后增加一个新的数字,使得该组合得到的连续数列最长……

如此递增计算。

但,这么做的前提是,之前的组合效果可以遗传。

如果最佳效果不能遗传,那么问题就成了需要穷举遍历所有Combin(1000,20)的组合了,
这个是做不到的。

Pic.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-5 18:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
香川群子 发表于 2017-7-5 18:43
选定20个数之后,检查连续数列这个比较容易一点。

所以,问题核心就在于如何选定20个数的间隔分布。

我也不确定。最初以为2^n序列要好一些,或者与斐波那契数列http://oeis.org/A000045
或者Rohrbach's problem http://oeis.org/A123509  有关

TA的精华主题

TA的得分主题

发表于 2017-7-5 19:03 | 显示全部楼层
不明真相的打酱油群众路过一下……
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2017-7-5 19:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-5 19:28 | 显示全部楼层

???
需要结果中从某数开始的连续数字最长,如本例可得到120个数字:2-121

TA的精华主题

TA的得分主题

发表于 2017-7-5 20:21 | 显示全部楼层
在1楼数列的基础上,检查优化得到最大连续个数=117【2 - 118】

1楼数列:1,2,3,4,5,6,7,14,21,28,35,42,49,56,63,70,77,84,91,98
  优化后:1,2,3,4,5,6,7,14,21,28,35,42,49,56,62,68,74,80,86,92


  1. Sub test() 'by kagawa 2017/7/5
  2.     Dim a&(), b, i&, i2&, k&, n&, n1&, t&, t2&
  3.     b = [{1,2,3,4,5,6,7,14,21,28,35,42,49,56,63,70,77,84,91,98}] '原始模板
  4.     For n1 = 2 To 20 '从第2个数开始检查替换
  5.         ReDim a(1 To 20) '重置数组a
  6.         For i = 1 To n1
  7.             a(i) = b(i) '根据模板填写前n1个数
  8.         Next

  9.         For n = n1 To 20 '循环检查填后面的数
  10.             t2 = f(a, n - 1): k = 0 '计算当前最大连续数t 以及没有变化的计数k归零
  11.             For i = a(n - 1) + 1 To 1000 '以前一个数+1开始检查替换
  12.                 a(n) = i: t = f(a, n) '替换 并统计最大连续个数
  13.                 If t > t2 Then t2 = t: i2 = i Else k = k + 1: If k > 5 Then Exit For
  14.                 '更新连续个数的最大值t2 如果此值不能增大则连续5个数都不增大则提前结束
  15.             Next
  16.             a(n) = i2 '更新为第一个有效最大值时的数字
  17.         Next
  18.         Cells(n1, 1) = t2 '输出连续最大个数
  19.         Cells(n1, 2).Resize(, n - 1) = a '输出这一组数
  20.     Next
  21. End Sub

  22. Function f&(a, n&) '统计最大连续个数的自定义函数 解释略
  23.     Dim i&, i2&, k&, k2&, n1&, n2&, t&
  24.     n1 = a(1) + a(1): n2 = a(n) + a(n)
  25.     ReDim b(n1 To n2) As Boolean
  26.     For i = 1 To n
  27.         t = a(i)
  28.         For i2 = 1 To n
  29.             b(t + a(i2)) = True
  30.         Next
  31.     Next
  32.     For i = n1 To n2
  33.         If b(i) Then k = k + 1 Else If k > k2 Then k2 = k: k = 0
  34.     Next
  35.     If k > k2 Then k2 = k
  36.     f = k2
  37. End Function
复制代码

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-28 11:21 , Processed in 0.025055 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表