找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 696|回复: 6

[研讨] 判断数列里是否存在某几个数的和值为K

[复制链接]

已领礼包: 1883个

财富等级: 堆金积玉

发表于 2020-2-2 11:54:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
如何快速判断一列数里是否存在某几个数相加的和值为确定值K?
如数列为{27,15,13,9,6,4,1},K=35。只讨论算法判断过程。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-2-2 22:20:09 | 显示全部楼层
先说说我的算法吧。先将数列由大到小排序,令vlst=nil.
1、令sum=0,然后从第一个数开始,若sum=sum+ai<=K,则计入ai,否则不计入,一遍走完后会得到一个和值不大于K的子列表lst1,将lst1放入vlst,同时将lst1放在原数列尾部;
2、重复1过程。
判断准则1、若某个lsti和值为K,则可判断存在;2、若重复了n次,Vlst={lis1,list2…listi…listn},仍没有和值为K的list,但再多走一步,出现的listj在vlst中出现过,即可判断不存在。

1、{27  15  13   9  6  4  1}={15  13   9   4   27   6   1}     vlst={{27   6  1}}
2、{15  13   9   4   27 6 1} ={9   27   6   15  13   4   1}    vlst={{27   6  1} {15   13   4  1}  }
3、{9   27   6   15  13   4   1} ={27  13   9  6   15   4   1}    vlst={{27   6  1} {15   13   4  1} {9   6   15  4  1} }  此时{9   6   15  4  1}满足要求及存在。此时可以终止程序,但为了说明算法,继续往下验算。
4、{27  13   9  6   15   4   1}={13   9  15    4  27  6  1}    vlst={{27   6  1} {15   13   4  1} {9   6   15  4  1} {27   6  1} } 而  {27   6  1} 在前面出现过,假设前面不存在和值为K的情况,那么此时就可判断不存在,终止程序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-2-2 22:21:15 | 显示全部楼层
前提有两点需要证明:
1、不断重复下去,Vlst中一定会出现相同的listi(排好序后再比较);
2、两相同listi之间若不存在和值为K的list,之后也一定不存在和值为K的list.(类似转了一圈都不存在)


循环的条件为

{while   (list和值不为K   or    list不在vlst中出现过)

  循环操作1和2;

}

点评

对于第1条,可以看成在一个封闭的系统里不停变换状态(最多n!个状态),一定会出现list相同的情况。既不会出现死循环。 对于第2条,a1的位置不好判断,有时移到尾部(数列较短时),有时向前移动(数列较长时)。即  详情 回复 发表于 2020-2-2 22:26
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-2-2 22:22:52 | 显示全部楼层
上述是在无重复数字的情况下。若ai重复ki个,则只保留min{K/ai,ki}个ai,组成的数列再排序,进行运算。如判断(27,27,15,15,15,13,13,13,9,9,9,9,6,6,6,6,6,6,4,4,1,1,1)是否存在和值为35的组合,则先将列表预处理成(27,15,15,13,13,9,9,9,6,6,6,6,6,4,4,1,1,1),再进行判断。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-2-2 22:26:03 | 显示全部楼层
aimisiyou 发表于 2020-2-2 22:21
前提有两点需要证明:
1、不断重复下去,Vlst中一定会出现相同的listi(排好序后再比较);
2、两相同listi ...

对于第1条,可以看成在一个封闭的系统里不停变换状态(最多n!个状态),一定会出现list相同的情况。既不会出现死循环。
对于第2条,a1的位置不好判断,有时移到尾部(数列较短时),有时向前移动(数列较长时)。即判断结果为不存在的正确性需要理论证明。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4365个

财富等级: 富可敌国

发表于 2020-2-7 00:08:25 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 6578个

财富等级: 富甲天下

发表于 2020-2-8 00:08:36 | 显示全部楼层
期待大家一起来讨论,新年快乐
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-22 09:41 , Processed in 0.398937 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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