挑战题:一个比较复杂的装箱问题

有一个表,字段为:物品名,件数。记录:

 物A 54  

 物B 35 

 物C 23 

 物D 98 

 物E 43

现要对这些物品装箱,

箱子要按照顺序进行打包,每个箱子的容量不一致。

记录:

箱子A  60

箱子B  70

箱子C  50

箱子D  40

箱子E  100

需要得到下表结果。

箱子A物品A54
箱子A物品B6
箱子B物品B29
箱子B物品C23
箱子B物品D18
箱子C物品D50
箱子D物品D30
箱子D物品E10
箱子E物品E33

请问怎么解决?

大家一起玩一玩,我加悬赏。如果是数据库sql方式实现的,请麻烦转下mysql。别的我怕看不懂。

第一个出完美答案的同学得奖金。大家当作游戏,万勿较真

FineReport flyingsnake 发布于 2021-11-23 11:10 (编辑于 2021-11-23 12:43)
1min目标场景问卷 立即参与
回答问题
悬赏:56 F币 4人赏过 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共8回答
最佳回答
0
杨朝健Lv5中级互助
发布于2021-11-23 11:41(编辑于 2021-11-23 12:31)

这个不是之前的装箱问题吗

https://bbs.fanruan.com/wenda/question/8195.html

https://bbs.fanruan.com/wenda/question/77620.html

卡片分栏-https://help.fanruan.com/finereport/doc-view-354.html

也可以用sql实现:

image.png

select xid,wid

,case when xz.累计当前行>=wp.累计当前行 and xz.累计上一行<=wp.累计上一行 then wnum

      when xz.累计当前行>=wp.累计当前行 and xz.累计上一行> wp.累计上一行 then wnum-(xz.累计上一行-wp.累计上一行)

when xz.累计当前行< wp.累计当前行 and xz.累计上一行> wp.累计上一行 then xnum

      else xz.累计当前行-wp.累计上一行 end as 数量

from (

-- 物品

select wid,wnum

,sum(wnum) over (order by wid) as 累计当前行

,nvl(sum(wnum) over (order by wid rows between unbounded preceding and 1 preceding),0) as 累计上一行

from (

select '物A' as wid,54 as wnum union all

select '物B' as wid,35 as wnum union all

select '物C' as wid,23 as wnum union all

select '物D' as wid,98 as wnum union all

select '物E' as wid,43 as wnum -- union all

) a

) wp

join (

-- 箱子

select xid,xnum

,sum(xnum) over (order by xid) as 累计当前行

,nvl(sum(xnum) over (order by xid rows between unbounded preceding and 1 preceding),0) as 累计上一行

from (

select '箱子A' as xid,60  as xnum union all

select '箱子B' as xid,70  as xnum union all

select '箱子C' as xid,50  as xnum union all

select '箱子D' as xid,40  as xnum union all

select '箱子E' as xid,100 as xnum -- union all

) a

) xz

on xz.累计当前行>wp.累计上一行 and xz.累计上一行<wp.累计当前行

limit 100

image.png

最佳回答
0
yzm339714Lv6中级互助
发布于2021-11-23 11:19

程序处理把,不要为难sql 了

最佳回答
0
孤陌Lv6资深互助
发布于2021-11-23 11:22

逐层累减 应该可以解决

最佳回答
0
AV爸弟Lv6初级互助
发布于2021-11-23 11:36

我只想问下,这个悬赏发布多久?

  • flyingsnake flyingsnake(提问者) 这个就是个游戏,看大家谁更快吧。由完美解决方案,就结束了
    2021-11-23 12:12 
最佳回答
0
胡歌Lv7中级互助
发布于2021-11-23 11:40(编辑于 2021-11-23 12:16)
const goods = [['A', 54], ['B', 35], ['C', 23], ['D', 98], ['E', 43]]; const box = [['A', 60], ['B', 70], ['C', 50], ['D', 40], ['E', 100]]; for (let i = 0; i < box.length;) {     for (let j = 0; j < goods.length;) {         if (goods[j][1] <= box[i][1]) {             if (goods[j][1] !== 0) {                 console.log('箱子', box[i][0], ' ', '物品', goods[j][0], ' ', goods[j][1]);             }             box[i][1] -= goods[j][1];             goods[j][1] = 0;             j++;         } else {             if (box[i][1] !== 0) {                 console.log('箱子', box[i][0], ' ', '物品', goods[j][0], ' ', box[i][1]);             }             goods[j][1] -= box[i][1];             box[i][1] = 0;             i++;             break;         }         if (i === box.length-1 && j === box.length-1) return;     } }

WechatIMG5832.jpeg

最佳回答
0
熊猫头Lv6初级互助
发布于2021-11-23 12:37

04af3a2b150d9ab7874399d01a8d922.png

最佳回答
0
eatRiceLv4见习互助
发布于2021-11-23 14:02(编辑于 2021-11-23 14:18)

思路就是把物体和箱子按照优先级(产生多条数据)排序(其实就是记录对应位置),排完之后比如箱子1-200 ,物体1-100.左联之后去掉空的就行了S(4[D4$NX72J2}F8)A]162M.png

最佳回答
0
用户W4933403Lv5初级互助
发布于2021-11-23 15:30

image.png

  • 13关注人数
  • 1127浏览人数
  • 最后回答于:2021-11-23 15:30
    请选择关闭问题的原因
    确定 取消
    返回顶部