查找总和小于给定数组的最大数组数

时间:2012-10-17 19:23:55

标签: algorithm

给定长度为n的数组x和一组数组S使得S中的每个数组具有长度n,在S中找到数组G的最大尺寸集合,使得对于所有1< = i< = n ,x [i]> = G中所有g的总和(g [i])。

e.x。如果x = [3,3]且S = {[3,0],[1,1],[2,1]},则最佳集合为{[1,1],[2,1]},因为和为[3,2],每个索引处的元素小于x中的对应元素。 {[3,0],[1,1]}不起作用,因为总和是[4,1],并且4> x [0] = 3。

是否存在运算时间为n且| S |?

的多项式的算法

背景/上下文: 这个问题来自一个关于拼字游戏的问题。给定一个瓷砖列表和一个单词,你能用瓷砖形成这个单词吗?我将它扩展为给定一个瓦片列表和一个单词列表,列表中可以从瓦片中形成的最大单词数是多少?

1 个答案:

答案 0 :(得分:3)

这是multi-dimensional knapsack problem

为证明在n|S|中都没有算法,多项式时间(或证明这是Strongly NP-hard problem),请简化此问题,仅允许值{ {1}}表示数组1,数值x0表示数组1。在这种简化之后,我们得到了Set packing的优化版本,这是一个经典的NP完全问题。

与集合打包问题的关系表明,也没有良好的近似算法。

这留下了非常有限的算法选择:

  1. Branch-and-bound
  2. Integer linear programming
  3. Metaheuristic algorithms,例如Simulated annealingTabu search