Python 排序算法思想

Python 排序算法思想,python,algorithm,sorting,math,Python,Algorithm,Sorting,Math,我想为特定的游戏目录创建一个排序算法 每个项目都有一个ID和一个大小(1-3)。大小反映了它在库存中垂直占用的插槽数量 我想创建一个排序算法,主要使用它的大小,这样最大的项目是第一个,这将是非常简单的。但是,清单有多个页面,每个页面有5列10行。这就是问题所在。从逻辑上讲,您将用3个大小的项目填充第一个库存,但这意味着在最后一行中不会有任何项目。因此,算法必须用3个大小项填充前6行,用2个大小项填充后4行。项目的数量是动态的,因此可能不是每次都是这样。谁能给我指出正确的方向吗?我正在使用pyth

我想为特定的游戏目录创建一个排序算法

每个项目都有一个ID和一个大小(1-3)。大小反映了它在库存中垂直占用的插槽数量

我想创建一个排序算法,主要使用它的大小,这样最大的项目是第一个,这将是非常简单的。但是,清单有多个页面,每个页面有5列10行。这就是问题所在。从逻辑上讲,您将用3个大小的项目填充第一个库存,但这意味着在最后一行中不会有任何项目。因此,算法必须用3个大小项填充前6行,用2个大小项填充后4行。项目的数量是动态的,因此可能不是每次都是这样。谁能给我指出正确的方向吗?我正在使用python。多谢各位

如果您的目标是:

  • 最小化未占用的行数
  • 然后在同等的解决方案中,选择“大项目”最多的解决方案
您可以应用0-1背包算法:将“成本”最大化到10

下面是一个解决方案,它是从以前的解决方案粘贴和改编而来的

长话短说:

  • 应用背包(自己动手,代码仅用于说明)
  • 候选项是从所有可用项中选择的一组项
  • 在下面的implem中,我们增加了候选大小,使之和相等,其大小越短,其中的项目越大(这满足了我们的要求)
  • 如果没有达到10,则默认为总和最接近10的候选项(最佳回退)

我想帮忙(爱阿尔戈斯!)。但问题并不十分清楚。你能提供一些正面和负面的例子吗。那会很有帮助的。好的,水平尺寸呢?所有项目的宽度是否相同(1列)?
from collections import namedtuple
def pick_items (values):
  S = 10
  Candidate = namedtuple('Candidate', ['sum', 'lastIndex', 'path'])
  tuples = [Candidate(0, -1, [])]

  best_fallback = tuples[0]
  while len(tuples):
    next = []
    for (sum, i, path) in tuples:
      for j in range(i + 1, len(values)):
        v = values[j]
        if v + sum <= S:
          candidate = Candidate(sum = v + sum, lastIndex = j, path = path + [v])
          if candidate[0] > best_fallback[0]:
            best_fallback = candidate
          next.append(candidate)
          if v + sum == S:
            return path + [v]
    tuples = next
  return best_fallback[2]

print(pick_items([3,3,3,1])) #finds the trivial sum [3, 3, 3, 1]
print(pick_items([1,3,3,1])) #returns the closest to goal [1, 3, 3, 1]
print(pick_items([2,2,2,2,2,1,3,3,1])) #returns the shortest set [2, 2, 3, 3]
print(pick_items([3,3,2,2,3])) #returns an exact count [3, 3, 2, 2]
print(pick_items([3,1,1,1,2,2,2,2])) #shortest set as well [3, 1, 2, 2, 2]
def pick_items (values):
  # force biggest items solution to be explored first
  values = sorted(values, reverse=True)
  S = 10