我有一个要在网格中显示的n个徽标列表,每行最多3个。 什么算法决定每行显示多少,以便每行的徽标数尽可能平衡,而不使用超过最小可能行数?
例如:
n -> number in each row
1 -> 1
2 -> 2
3 -> 3
4 -> 2, 2
5 -> 3, 2
6 -> 3, 3
7 -> 3, 2, 2
8 -> 3, 3, 2
9 -> 3, 3, 3
10 -> 3, 3, 2, 2
答案 0 :(得分:11)
答案 1 :(得分:6)
因为你的问题令人困惑,我认为你需要做的是先确定:
number_of_rows = ceil(number_of_logos / 3.0)
然后在每行添加一个徽标,一次一个。
的Python:
import math
def partition_logos(count, lsize):
num_lines = int(math.ceil(count / float(lsize)))
partition = [0] * num_lines
for i in xrange(count):
partition[i%num_lines] += 1
return partition
>>> for i in xrange(1,11):
... print partition_logos(i, 3)
[1]
[2]
[3]
[2, 2]
[3, 2]
[3, 3]
[3, 2, 2]
[3, 3, 2]
[3, 3, 3]
[3, 3, 2, 2]
答案 2 :(得分:1)
只需使用n / 3计算行,使用n%3计算列
编辑:好的,我看到你编辑了你的问题....我没有看到你想要在每行显示2,如果是4个徽标。但是你可以使用n mod 3来计算他们是否像其他人已经建议的那样提醒
如果n%3 = 0,则每行只放3个徽标 如果n%3 = 1,则将最后4个徽标放在两行中 如果n%3 = 2则将3个徽标放在n行中,将最后2个徽标放在单独的行中
答案 3 :(得分:1)
Python中的递归解决方案:
def logos_by_row(N, rows):
width = 0
if N > 4 or N == 3:
width = 3
elif N == 4 or N == 2:
width = 2
elif N == 1:
width = 1
if width != 0:
rows.append(width)
logos_by_row(N - width, rows)
answer = []
for i in range(10):
logos_by_row(i+1, answer)
print answer