我是否需要使用装箱算法或背包?

Do I need to use a bin packing algorithm, or knapsack?

问题陈述如下:

I have m chocolate bars, of integer length, and n children who want integer amounts of chocolate. Where the total chocolate needs of the children are less than or equal to the total amount of chocolate you have. You need to write an algorithm that distributes chocolate to the children by making the least number of cuts to the bars.

例如,对于 M = {1,3,7},N = {1,3,4},最少的削减次数为 1.

我没有任何正式的算法经验,任何人都可以给我任何提示,让我知道我应该开始阅读什么以有效地解决这个问题吗?

这个任务可以简化为解决几个背包问题。解决这些问题,通常采用贪心搜索的原则,以割的多少作为搜索的准则。

算法的第一个明显步骤是检查余额。 第二步是排列巧克力棒和巧克力需求的数组,这将简化进一步的计算。这实现了贪心搜索的原则。 第三个显而易见的步骤是找到并使用所有大小符合需要的条。

下一步是找到并使用满足需求的所有柱组合。此任务需要按需求的降序进行 "greedy" 搜索,这将在进一步的计算中继续进行。这个标准不是最优的,但它允许形成一个基本的解决方案。

如果不是所有 children 都收到巧克力,那么切口就很明显了。应根据图块的降序大小进行搜索。首先,应该检查所有可能性,将切割的瓷砖一次给两个 children,然后相同,但如果使用一个现有的瓷砖,等等。 之后有一个明显的变体 "one cut - one need",允许形成基本变体。但是如果还有剩余的计算资源,可以先计算"two slits - three needs"等类型的选项

进一步优化包括返回到以下变体的步骤和计算。