老哥们,一个算法求个思路

2021-12-28 17:39:18 +08:00
 cyrbuzz

老哥们求教,给难住了= =。

场景是这样的:

有很多 PDF ,准备发给不同的邮箱,但因为邮箱附件的大小限制,每一封邮件只能发送 50MB 的附件,所以需要将待发送的 PDF 进行合理的切分,用尽可能少的发件数量完成发送,每个 PDF 都不会超过 50MB 。

目前的策略是排序后从大到小做的贪心切分,实际多发一封也没啥问题,就是没解出来有点堵得慌...尝试了 DP 好像又不完全是 DP 也可能姿势不对 /(ㄒoㄒ)/~~。

一个例子,下面表示文件大小:

[1,2,3,5,8,9,12] max 为 20 时期望的切分出来的结果是:

[[1,2,3,5,9], [8, 12]] 或者 [[1,2,8,9],[3,5,12]],符合条件就可以= =。

3168 次点击
所在节点    程序员
29 条回复
fcxxzux
2021-12-28 18:58:39 +08:00
如果对于最优解有执着的追求,pdf 数量也就几百个,
可以试试规划求解器,比如 Google OR-Tools 有现成代码 https://developers.google.com/optimization/bin/bin_packing
xuanbg
2021-12-28 22:43:20 +08:00
貌似很复杂,但实际上不就是按发送列表里面的最小附件容量切分文件吗?无非就是不同列表最小值不同罢了。如果是多个文件组合发给多个列表,那么针对不同列表,把多个文件分别打对应列表的最小值分包压缩就是了。
cyrbuzz
2021-12-29 10:05:06 +08:00
@yehoshua
@flyingghost

分卷压缩之前确实没想到,已加入保底方案中,标题这个看到回复立马就实现了,谢谢!
cyrbuzz
2021-12-29 10:05:40 +08:00
@fcxxzux

强的老哥,这下可以跑测试用例验证了。
cyrbuzz
2021-12-29 10:07:19 +08:00
@xuanbg

还是有点不同的,已生成的 PDF 无法继续分割和融合,不能改变原 PDF 只能挑选组合他们。
joApioVVx4M4X6Rf
2021-12-29 10:09:34 +08:00
要发送的 PDF 打个压缩包,把大于 50M 的压缩包分割
ccraohng
2021-12-29 15:15:45 +08:00
有些邮箱网易还是 qq 是 10mb 限制。
对文件链接没有做安全限制,可以采用文件链接来下载
wangtian2020
2021-12-29 15:51:36 +08:00
如果是算法题我直接 DFS 梭了
如果是实际应用我直接把所有文件 50MB 分卷压缩
gablic
2021-12-29 16:15:58 +08:00
跑个题,能不能放云端邮件发链接

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/824934

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX