Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 1cf8661

Browse files
authored
feat: add python solution to lc problem: No.2902 (doocs#1854)
No.2902.Count of Sub-Multisets With Bounded Sum
1 parent 2dc74b6 commit 1cf8661

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

solution/2900-2999/2902.Count of Sub-Multisets With Bounded Sum/README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,27 @@
6868
<!-- 这里可写当前语言的特殊实现逻辑 -->
6969

7070
```python
71+
class Solution:
72+
def countSubMultisets(self, nums: List[int], l: int, r: int) -> int:
73+
kMod = 1_000_000_007
74+
# dp[i] := # of submultisets of nums with sum i
75+
dp = [1] + [0] * r
76+
count = collections.Counter(nums)
77+
zeros = count.pop(0, 0)
78+
79+
for num, freq in count.items():
80+
# stride[i] := dp[i] + dp[i - num] + dp[i - 2 * num] + ...
81+
stride = dp.copy()
82+
for i in range(num, r + 1):
83+
stride[i] += stride[i - num]
84+
for i in range(r, 0, -1):
85+
if i >= num * (freq + 1):
86+
# dp[i] + dp[i - num] + dp[i - freq * num]
87+
dp[i] = stride[i] - stride[i - num * (freq + 1)]
88+
else:
89+
dp[i] = stride[i]
90+
91+
return (zeros + 1) * sum(dp[l : r + 1]) % kMod
7192

7293
```
7394

solution/2900-2999/2902.Count of Sub-Multisets With Bounded Sum/README_EN.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,27 @@
6060
### **Python3**
6161

6262
```python
63+
class Solution:
64+
def countSubMultisets(self, nums: List[int], l: int, r: int) -> int:
65+
kMod = 1_000_000_007
66+
# dp[i] := # of submultisets of nums with sum i
67+
dp = [1] + [0] * r
68+
count = collections.Counter(nums)
69+
zeros = count.pop(0, 0)
70+
71+
for num, freq in count.items():
72+
# stride[i] := dp[i] + dp[i - num] + dp[i - 2 * num] + ...
73+
stride = dp.copy()
74+
for i in range(num, r + 1):
75+
stride[i] += stride[i - num]
76+
for i in range(r, 0, -1):
77+
if i >= num * (freq + 1):
78+
# dp[i] + dp[i - num] + dp[i - freq * num]
79+
dp[i] = stride[i] - stride[i - num * (freq + 1)]
80+
else:
81+
dp[i] = stride[i]
82+
83+
return (zeros + 1) * sum(dp[l : r + 1]) % kMod
6384

6485
```
6586

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution:
2+
def countSubMultisets(self, nums: List[int], l: int, r: int) -> int:
3+
kMod = 1_000_000_007
4+
# dp[i] := # of submultisets of nums with sum i
5+
dp = [1] + [0] * r
6+
count = collections.Counter(nums)
7+
zeros = count.pop(0, 0)
8+
9+
for num, freq in count.items():
10+
# stride[i] := dp[i] + dp[i - num] + dp[i - 2 * num] + ...
11+
stride = dp.copy()
12+
for i in range(num, r + 1):
13+
stride[i] += stride[i - num]
14+
for i in range(r, 0, -1):
15+
if i >= num * (freq + 1):
16+
# dp[i] + dp[i - num] + dp[i - freq * num]
17+
dp[i] = stride[i] - stride[i - num * (freq + 1)]
18+
else:
19+
dp[i] = stride[i]
20+
21+
return (zeros + 1) * sum(dp[l : r + 1]) % kMod

0 commit comments

Comments
 (0)