|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2018/11/30 11:35:10 |
标题: |
|
加入我的收藏 |
楼主: |
我有一堆数字(50个左右);
我想从其中抽取一些数字出来相加的和与我 指定的一个值最接近(或相等)
---
主要用于仓库领料,仓管员想从一些员工的领料单中抽取一部分领料数相加后最接近一箱(仓库保存的材料都是一箱箱装好的)的数量,然后直接一箱派发出去给员工们自己去分;
---
一直找不到一个合理的思路,只想着类似排序组合的方式,把的有组合方式相加出一个结果,然后再批对。
但这个方法好笨,就象双色球,蓝球定死了从33个数字里面取6个。这种组合方法都有 110万多种组合方式。
----------------------------------------------
我是菜鸟,己经搞了十多年了,但是我仍然很菜。 |
作者: |
oyefer (oyefer) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2018/11/30 12:47:52 |
1楼: |
你这个是经典算法问题,搜搜01背包吧。
----------------------------------------------
-
|
作者: |
|
2018/11/30 13:09:12 |
2楼: |
我水平也低,只会 穷举。 数学家们会,但是他们上的网,和咱们不一样。
----------------------------------------------
(C)(P)Flying Wang
|
作者: |
|
2018/11/30 16:29:01 |
3楼: |
我试一下,就算用穷举法,都不容易呀。。
----------------------------------------------
我是菜鸟,己经搞了十多年了,但是我仍然很菜。
|
作者: |
|
2018/11/30 16:46:23 |
4楼: |
一个建议, 先把数字从大到小排序,相当于往篮子里放东西,看总重量能不能凑够一个目标数 从大的开始试,下一个放进去的要小于等于总和减去现有的,如果不行就回退到上一步,换小一点的
----------------------------------------------
-
|
作者: |
|
2018/11/30 18:28:52 |
5楼: |
建议用倒冲领料的方式处理。
----------------------------------------------
-
|
作者: |
sspeak (sspeak) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2018/12/1 3:29:16 |
6楼: |
4楼的方法可行!
----------------------------------------------
-
|
作者: |
sspeak (sspeak) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2018/12/1 3:30:40 |
7楼: |
从大到小排序后,用递归,应该很简单。
----------------------------------------------
-
|
作者: |
|
2018/12/1 7:07:32 |
8楼: |
支持4楼,也可以先从小数开始,这样仓库箱子最少。当然,最终函数只是加个方向的参数而已。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
|
作者: |
|
2018/12/1 11:58:36 |
9楼: |
1、从小数开始,肯定不合理(因为小的数用完,当大的数,只差一个小一点数时,就没得用了。);
2、从大往小到是可以,但是仍然有很多功夫要做;
比如:有数据 2,10,18,19,28,35,40,62,70;我指定一个数是 100
理论上,最理想的数,应该是:70+18+10+2, 但是如果不做好一些处理,估计得到的数是:70+28 就完事,但是它不是最合理的;
还要多循环两次。跳过70+28,再跳过 70+19+10,而得到更合理的下一组70+18+10+2。
实现起来也有些麻烦;
----------------------------------------------
我是菜鸟,己经搞了十多年了,但是我仍然很菜。
|
作者: |
|
2018/12/1 12:17:31 |
10楼: |
70 28 2也是合法的^_^ 相等的优先级最高,然后是少1,少2...
----------------------------------------------
-
|
作者: |
|
2018/12/1 14:37:02 |
11楼: |
以楼主的例子看,可以采用动态分组(n组可调),然后按权重来进行。 例如:60~100一组,10~60一组,其他一组。然后再算
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
|
作者: |
|
2018/12/2 8:05:38 |
12楼: |
似曾相识的感觉,原来写过一个装备升级的程序,由各种型号的材料合成,当时是用lua写的脚本。我问了一个大学老师,还是教数学的,他做不出来。我没有源代码了,全丢了。
----------------------------------------------
-
|
作者: |
|
2018/12/2 9:17:08 |
13楼: |
50个数字,穷举就好了。有50万个数字才值得专门写算法。
----------------------------------------------
武稀松http://www.raysoftware.cn
|
作者: |
|
2018/12/6 12:54:24 |
14楼: |
递归,入口,数组(排序),目标值, 例,目标100,数组2,10,18,19,28,35,40,62,70, 取数组中小于目标的最大值,70,记录 递归,目标100-70=30,数组2,10,18,19,28,35,40,62 数组为原数组中小于上次取值的那些 取数组中小于目标的最大值,28,记录 递归,目标30-28=2,数组2,10,18,19 获得最优解2,目标为0,记录,递归结束 70+28+2 ========== 例,目标100,数组10,18,19,28,35,40,62,70, 取数组中小于目标的最大值,70,记录 递归,目标100-70=30,数组10,18,19,28,35,40,62 数组为原数组中小于目标值,小于上次取值的那些 取数组中小于目标的最大值,28,记录 递归,目标30-28=2,数组10,18,19 无最优解,目标为2,记录为AAA 无最优解,回上一步, 目标100-70=30,数组10,18,19,28,35,40,62 取数组中小于上次取值的最大值(上次取值19),18,记录 目标30-18=12,数组10,18 无最优解,取值10,目标为2,记录为CCC 无最优解,回上一步, 。。。 无最优解,回上一步,上一步, 取数组中小于上次取值的最大值(上次取值70),62,记录 递归,目标100-62=38,数组10,18,19,28,35 。。。。 得到最优解 62+28+10 。。。。。。。。。
----------------------------------------------
-
|
作者: |
|
2018/12/6 12:55:52 |
15楼: |
无最优解时,取之前记录AAA,BBB,CCC中最接近的(可以提前判定)
----------------------------------------------
-
|
|