我想编写一个小工具来组织我的数字化有声读物收藏。我有一组需要写入光盘的文件夹,这些文件夹不能被拆分:每个文件夹都需要写入一张光盘。我希望尽可能高效地填满光盘:
- 最小化光盘数量
- 如果光盘数量相等,则最大化最空闲光盘的可用存储空间(剩余空间为 80 + 20 比 50 + 50 更好)。
这被称为装箱问题,它是NP难问题,因此没有简单的算法可以解决它。
我找到的最好的解决方案(我运行了一个编程竞赛,提出了一个几乎与此相同的问题),是按大小排序文件夹,并将最大的适合光盘的文件夹放入,直到光盘已满或所有剩余文件夹都太大而无法放入剩余空间。
由于排序后,算法的其余部分是O(n),因此这个解决方案可以快速解决问题。
在我举办的比赛中,这导致使用74张光盘,而朴素解决方案会使用79张光盘来处理我们的最大测试数据集。
此外:
也许以贪婪的方式应用这个算法"装一个光盘,装下一个光盘"会起到作用?