以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  求助一段计算代码~  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=99298)

--  作者:huangxueyao
--  发布时间:2017/4/17 7:45:00
--  求助一段计算代码~
假如
drs = DataTables("订单明细").Select("[产品] = \'PD01\',"数量 DESC")
查询到的订单中,数量按以下排列:
7
6
5
4
3
2
1
一个订单有7个产品,
我们打包时,有两个条件:
1、每个包裹的数量小于等于10;
2、同一个订单的所有包裹的产品数量应该尽可能平均。

我的思路是:
  1. 计算出产品总数M=27
  2. 计算出包裹总数N=27/10,向上取整为3
  3. 计算出每个包裹应该包装的产品平均数m=27/3=9
  4. 按照select的结果从大到小排序,从第一个(7)开始
    1. 如果≥m,此产品单独组合成一个包裹;
    2. 如果<m:
      1. 查询第二个记录,产品数量相加,如果总数>10,组合失败,继续往下查询;
      2. 当某两个产品的组合数量<m时,继续往下组合,直到满足≥m且≤10时,这个包裹才算成功。
这样的话,如果订单记录是:
7|6|5|4|3|2|1的话,其包裹组合是7+3|6+4|5+2+1
如果订单记录是:
7|7|7|2|2|1|1的话,其包裹组合是7+2|7+2|7+1+1
如果订单记录是:
4|4|3|3|2|2|1的话,其包裹组合是4+4+2|3+3+2+1

我的困难主要是:组合阶段的代码
这里涉及比较多的嵌套,而且已经成功组合过包裹的产品在下一次计算中又要排除掉。

求帮忙………………
万分感谢~

--  作者:huangxueyao
--  发布时间:2017/4/17 7:49:00
--  
另外一个思路是,一大配多小

这样的话,如果订单记录是:
7|6|5|4|3|2|1的话,其包裹组合是7+1+2|6+3|5+4
如果订单记录是:
7|7|7|2|2|1|1的话,其包裹组合是7+1+1|7+2|7+2
如果订单记录是:
4|4|3|3|2|2|1的话,其包裹组合是4+1+2+2|4+3+3

[此贴子已经被作者于2017/4/17 7:49:18编辑过]

--  作者:有点色
--  发布时间:2017/4/17 8:52:00
--  

排列组合的例子参考

 

下载信息  [文件大小:316.0 KB  下载次数:37]
图片点击可在新窗口打开查看点击浏览该文件:排列组合.table

 

你可以任意组合排列出符合10、10、10的组合,比如 7654321 组合就有 721 64 541 73 之类的,然后分析这些是否满足 7654321,满足就可以,如果不满足,就改成符合10、10、9的组合,依次类推。