取最接近组合

castyoung 2016-09-08 07:03:31
现在有个需求是 有任意位数 例如 : 135,231,342,521,633,411,622,75 …… 可以有更多
我要随机取组合 取任意个 只要他们的和不大于1000 但是要非常接近(例如他们的和在 950-1000之内 当然 如果数字组不成那么多 是可以小于950 不能大) , 取到后这些数 算是一组 这些数在上面的数组中移除掉 , 若剩下的还有则再取,若剩下的不够 自动算一组
如第一组取到 633 342 和为964 就算是成功的一组 并在以上移除掉,取剩下满足条件的组
有没有大神来帮忙 ,想了很久 都只能取到不太理想的组 就是 最后 每个组有1000减去他们的和 得到的值 太大 还不如人算
表述不是很清楚 有不清楚的请提出来

...全文
236 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-09-09
  • 打赏
  • 举报
回复
不要想的那么高深,其实最朴素的就是遍历所有可能性 对于 1,2,3,4,5 求 两数之和小于 5 遍历所有可能组合就是依次求出 1+2、1+3、1+4、1+5、2+3、2+4..... 你立即就会发现 1+5、2+4 是不需要做的 因为在数轴上,1+4 和 2+3 已经到达边界,所以不再需要计算下一个组合了 这就是算法,整数规划 就是探讨如何提前结束遍历的方法
Poopaye 2016-09-09
  • 打赏
  • 举报
回复
引用 2 楼 u014076523 的回复:
引用 1 楼 shingoscar 的回复:
先排个序,其他的慢慢想
是的我也这么想, 取出来的却不是最完美的
完美的标准是什么? 必要举例子 有没有可以用公式之类表示出来的?
wanghui0380 2016-09-09
  • 打赏
  • 举报
回复
当然上面两个方法都可以求解,只是不一定是最优解 如果想最优解,那么你需要做一个最优评定,比如方法一其实就是遗传算法的一种简单描述,而遗传算法要想最优,每次迭代都应该有优化判定,比较遗传就是要优胜劣汰
wanghui0380 2016-09-09
  • 打赏
  • 举报
回复
sum全加起来然后除以1000,大体估算能有几个1000 然后东西就简单了,比如有5个1000,那么你就想成有5个箱子 方法一:随机分配到5个箱子,然后从箱子里挑选超过的滴,补到不满滴(呵呵,天之道损有余而补不足) 方法二:随机往箱子里扔,直到箱子装满(满了就不装了),大概类似一般水果公司挑选水果一样,一个大转盘上面丢一堆水果,10个出口,水果随机从出口掉到箱子里,直到箱子装不下为止
software_artisan 2016-09-09
  • 打赏
  • 举报
回复
楼主你的预期是什么?尽可能多的组还是每组都尽可能接近1000?不同的预期,策略和算法都完全不同。
  • 打赏
  • 举报
回复
在.net 中,我们以前使用古老的、开源的 MathNet.Iridium 软件包来进行数学计算。 例如假设我们需要将某个未知地图坐标系上的数万个点映射到另外一个位置坐标系的地图上,那就需要调用一次规划方法,用几十好秒时间先找到最佳的拟合公式,然后就可以直接把数万个点(矩阵)乘以拟合公式,产生了新的矩阵。 这里最关键的不是编程,而是计算数学知识。
  • 打赏
  • 举报
回复
你有(比如说)50个维度,只有一个超级简单的约束条件(合计<=1000),要求解合计的最大值,随便使用一个整数规划工具(例如使用 Excel )都能轻松地算出来结果,而且应该(不考虑像Excel那样给你讲计算中间过程进行UI刷新的话)是1秒钟就找到结果。 “规划”算法它不是穷举的,是“爬山”的策略,每一次迭代都选择使得合计增大的可行解,而不是随便穷举可行解。
  • 打赏
  • 举报
回复
模型超级简单。 当数据很少的时候,你固然可以“穷举”所有可能的可行解集合。 但是如果数据多一些,你就应该使用整数规划方法。这是最最简单的模型,实际经济计划、生产管理等行业中使用中的模型比你这个复杂几十倍。
xuzuning 2016-09-09
  • 打赏
  • 举报
回复
满足条件的组合有: 342 + 622 = 964 342 + 633 = 975 231 + 342 + 411 = 984 135 + 342 + 521 = 998 135 + 231 + 622 = 988 135 + 231 + 633 = 999 135 + 342 + 411 + 75 = 963 135 + 231 + 521 + 75 = 962 由于你不允许复用(取到后这些数 算是一组 这些数在上面的数组中移除掉) 那么你的移除策略是什么?
castyoung 2016-09-08
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
先排个序,其他的慢慢想
是的我也这么想, 取出来的却不是最完美的
Poopaye 2016-09-08
  • 打赏
  • 举报
回复
先排个序,其他的慢慢想

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧