Skip to content

Commit db352af

Browse files
authored
Update maximum-number-of-groups-getting-fresh-donuts.py
1 parent d65cef2 commit db352af

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

Python/maximum-number-of-groups-getting-fresh-donuts.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,25 @@ def maxHappyGroups(self, batchSize, groups):
99
:type groups: List[int]
1010
:rtype: int
1111
"""
12-
def memoization(count, mask, remain, lookup):
12+
def memoization(batchSize, count, mask, remain, lookup):
1313
if lookup[mask] == 0:
14-
curr, basis = mask, 1
15-
for i in xrange(remain):
16-
basis *= count[i]+1
17-
curr //= count[i]+1
18-
a_remain = curr%(count[remain]+1)
14+
a_remain = 0
15+
if remain in count:
16+
curr, basis = mask, 1
17+
for i, c in count.iteritems():
18+
if i == remain:
19+
break
20+
basis *= c+1
21+
curr //= c+1
22+
a_remain = curr%(count[remain]+1)
1923
result = 0
2024
if a_remain:
21-
result = max(result, int(remain == 0) + memoization(count, mask-basis, 0, lookup))
25+
result = max(result, int(remain == 0) + memoization(batchSize, count, mask-basis, 0, lookup))
2226
else:
2327
curr, basis = mask, 1
24-
for i, c in enumerate(count):
28+
for i, c in count.iteritems():
2529
if curr%(c+1):
26-
result = max(result, int(remain == 0) + memoization(count, mask-basis, (remain-i)%len(count), lookup))
30+
result = max(result, int(remain == 0) + memoization(batchSize, count, mask-basis, (remain-i)%batchSize, lookup))
2731
basis *= c+1
2832
curr //= c+1
2933
lookup[mask] = result
@@ -39,9 +43,10 @@ def memoization(count, mask, remain, lookup):
3943
result += pair_count
4044
count[i] -= pair_count
4145
count[len(count)-i] -= pair_count
42-
max_mask = reduce(lambda total, c: total*(c+1), count, 1)
46+
count = {i:c for i, c in enumerate(count) if c}
47+
max_mask = reduce(lambda total, c: total*(c+1), count.itervalues(), 1)
4348
lookup = [0]*max_mask
44-
return result+memoization(count, max_mask-1, 0, lookup)
49+
return result+memoization(batchSize, count, max_mask-1, 0, lookup)
4550

4651

4752
# Time: O((b/2) * (n/(b/2)+1)^(b/2))
@@ -64,16 +69,17 @@ def maxHappyGroups(self, batchSize, groups):
6469
result += pair_count
6570
count[i] -= pair_count
6671
count[len(count)-i] -= pair_count
67-
max_mask = reduce(lambda total, c: total*(c+1), count, 1)
72+
count = {i:c for i, c in enumerate(count) if c}
73+
max_mask = reduce(lambda total, c: total*(c+1), count.itervalues(), 1)
6874
dp = [0]*max_mask
6975
for mask in xrange(len(dp)):
7076
remain = 0
7177
curr, basis = mask, 1
72-
for i, c in enumerate(count):
78+
for i, c in count.iteritems():
7379
ai = curr%(c+1)
7480
if ai:
7581
dp[mask] = max(dp[mask], dp[mask-basis])
76-
remain = (remain+ai*i)%len(count)
82+
remain = (remain+ai*i)%batchSize
7783
basis *= c+1
7884
curr //= c+1
7985
if mask != len(dp)-1 and remain == 0:

0 commit comments

Comments
 (0)