我的驱动器有DMG块。它们的大小总和严格低于47GB。我有11张DVD,每张都是4.7GB。我想使用尽可能少量的DVD,而不使用压缩(问题可能是超级的,因为它考虑了DMG文件方面的最佳组合。如果你愿意,你可以根据压缩文件来考虑它。 )。
您可以看到DMG文件具有任意大小。这么多解决方案都是可能的。
find . -iname "*.dmg" -exec du '{}' \; 3&> /dev/null
1026064 ./Desktop/Desktop2.dmg
5078336 ./Desktop/Desktop_2/CS_pdfs.dmg
2097456 ./Desktop/Desktop_2/Signal.dmg
205104 ./Dev/things.dmg
205040 ./Dev/work.dmg
1026064 ./DISKS/fun.dmg
1026064 ./DISKS/school.dmg
1026064 ./DISKS/misc.dmg
5078336 ./something.dmg
DVD中的文件可以有任意顺序。例如,CS_pdfs.dmg和Signal.dmg不需要位于某个磁盘上。
那么如何才能找到尽可能少量使用DVD的方法呢?
答案 0 :(得分:3)
您的问题在数学上称为bin packing problem(与knapsack problem有关。)
由于 np-hard ,非常很难有效地解决这个问题!有一个递归解决方案(动态编程+回溯),但即使这可能需要大量的空间和计算时间。
最直接的解决方案是greedy algorithm(参见Blindy的帖子),但这可能会产生不好的结果。
这取决于您要打包的项目数量(n)以及解决方案的精确度(更高的精度将增加运行时!)。对于小n,递归/强力或回溯解决方案就足够了,对于更大的问题我建议使用一些metaheuristic - 特别是genetic algorithms工作得很好并且在可接受的时间间隔内产生良好的近似值。
答案 1 :(得分:2)
完全替代解决方案:使用拆分并将边框切割为多张DVD。除了最后一个,你将获得100%的每个磁盘利用率。 http://unixhelp.ed.ac.uk/CGI/man-cgi?split
答案 2 :(得分:1)
你应该先尝试贪婪算法 - 也就是说,每次选择最适合剩余DVD的项目。虽然这不能保证工作良好,但这个问题是NP完全的,因此不存在有效的解决方案。我最近遇到了类似的问题,贪婪的算法在我的情况下运作得很好 - 也许它对你来说也不错。
答案 3 :(得分:0)
最通用的解决方案是实现一个简单的回溯算法,但我很确定在这种特殊情况下你可以按大小对它们进行排序,然后一遍又一遍地选择适合你光盘的最大文件,直到它满了为止,然后继续使用其余文件继续下一步。