Skip to content

Commit 8042235

Browse files
committed
feat: add solutions to lc problem: No.1692
No.1692.Count Ways to Distribute Candies
1 parent 170c10f commit 8042235

File tree

6 files changed

+185
-2
lines changed

6 files changed

+185
-2
lines changed

solution/1600-1699/1692.Count Ways to Distribute Candies/README.md

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,22 +64,95 @@
6464

6565
<!-- 这里可写通用的实现逻辑 -->
6666

67+
**方法一:动态规划**
68+
69+
我们定义 $f[i][j]$ 表示将 $i$ 个糖果分配给 $j$ 个手袋的不同分配方式的数量。初始时 $f[0][0]=1$,答案为 $f[n][k]$。
70+
71+
我们考虑第 $i$ 个糖果如何分配,如果第 $i$ 个糖果分配给一个新的手袋,那么 $f[i][j]=f[i-1][j-1]$;如果第 $i$ 个糖果分配给一个已有的手袋,那么 $f[i][j]=f[i-1][j]\times j$。因此,状态转移方程为:
72+
73+
$$
74+
f[i][j]=f[i-1][j-1]+f[i-1][j]\times j
75+
$$
76+
77+
最终的答案为 $f[n][k]$。
78+
79+
时间复杂度 $O(n \times k)$,空间复杂度 $O(n \times k)$。其中 $n$ 和 $k$ 分别为糖果的数量和手袋的数量。
80+
6781
<!-- tabs:start -->
6882

6983
### **Python3**
7084

7185
<!-- 这里可写当前语言的特殊实现逻辑 -->
7286

7387
```python
74-
88+
class Solution:
89+
def waysToDistribute(self, n: int, k: int) -> int:
90+
mod = 10**9 + 7
91+
f = [[0] * (k + 1) for _ in range(n + 1)]
92+
f[0][0] = 1
93+
for i in range(1, n + 1):
94+
for j in range(1, k + 1):
95+
f[i][j] = (f[i - 1][j] * j + f[i - 1][j - 1]) % mod
96+
return f[n][k]
7597
```
7698

7799
### **Java**
78100

79101
<!-- 这里可写当前语言的特殊实现逻辑 -->
80102

81103
```java
104+
class Solution {
105+
public int waysToDistribute(int n, int k) {
106+
final int mod = (int) 1e9 + 7;
107+
int[][] f = new int[n + 1][k + 1];
108+
f[0][0] = 1;
109+
for (int i = 1; i <= n; i++) {
110+
for (int j = 1; j <= k; j++) {
111+
f[i][j] = (int) ((long) f[i - 1][j] * j % mod + f[i - 1][j - 1]) % mod;
112+
}
113+
}
114+
return f[n][k];
115+
}
116+
}
117+
```
118+
119+
### **C++**
120+
121+
```cpp
122+
class Solution {
123+
public:
124+
int waysToDistribute(int n, int k) {
125+
const int mod = 1e9 + 7;
126+
int f[n + 1][k + 1];
127+
memset(f, 0, sizeof(f));
128+
f[0][0] = 1;
129+
for (int i = 1; i <= n; ++i) {
130+
for (int j = 1; j <= k; ++j) {
131+
f[i][j] = (1LL * f[i - 1][j] * j + f[i - 1][j - 1]) % mod;
132+
}
133+
}
134+
return f[n][k];
135+
}
136+
};
137+
```
82138
139+
### **Go**
140+
141+
```go
142+
func waysToDistribute(n int, k int) int {
143+
f := make([][]int, n+1)
144+
for i := range f {
145+
f[i] = make([]int, k+1)
146+
}
147+
f[0][0] = 1
148+
const mod = 1e9 + 7
149+
for i := 1; i <= n; i++ {
150+
for j := 1; j <= k; j++ {
151+
f[i][j] = (f[i-1][j]*j + f[i-1][j-1]) % mod
152+
}
153+
}
154+
return f[n][k]
155+
}
83156
```
84157

85158
### **...**

solution/1600-1699/1692.Count Ways to Distribute Candies/README_EN.md

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,72 @@
6363
### **Python3**
6464

6565
```python
66-
66+
class Solution:
67+
def waysToDistribute(self, n: int, k: int) -> int:
68+
mod = 10**9 + 7
69+
f = [[0] * (k + 1) for _ in range(n + 1)]
70+
f[0][0] = 1
71+
for i in range(1, n + 1):
72+
for j in range(1, k + 1):
73+
f[i][j] = (f[i - 1][j] * j + f[i - 1][j - 1]) % mod
74+
return f[n][k]
6775
```
6876

6977
### **Java**
7078

7179
```java
80+
class Solution {
81+
public int waysToDistribute(int n, int k) {
82+
final int mod = (int) 1e9 + 7;
83+
int[][] f = new int[n + 1][k + 1];
84+
f[0][0] = 1;
85+
for (int i = 1; i <= n; i++) {
86+
for (int j = 1; j <= k; j++) {
87+
f[i][j] = (int) ((long) f[i - 1][j] * j % mod + f[i - 1][j - 1]) % mod;
88+
}
89+
}
90+
return f[n][k];
91+
}
92+
}
93+
```
94+
95+
### **C++**
96+
97+
```cpp
98+
class Solution {
99+
public:
100+
int waysToDistribute(int n, int k) {
101+
const int mod = 1e9 + 7;
102+
int f[n + 1][k + 1];
103+
memset(f, 0, sizeof(f));
104+
f[0][0] = 1;
105+
for (int i = 1; i <= n; ++i) {
106+
for (int j = 1; j <= k; ++j) {
107+
f[i][j] = (1LL * f[i - 1][j] * j + f[i - 1][j - 1]) % mod;
108+
}
109+
}
110+
return f[n][k];
111+
}
112+
};
113+
```
72114
115+
### **Go**
116+
117+
```go
118+
func waysToDistribute(n int, k int) int {
119+
f := make([][]int, n+1)
120+
for i := range f {
121+
f[i] = make([]int, k+1)
122+
}
123+
f[0][0] = 1
124+
const mod = 1e9 + 7
125+
for i := 1; i <= n; i++ {
126+
for j := 1; j <= k; j++ {
127+
f[i][j] = (f[i-1][j]*j + f[i-1][j-1]) % mod
128+
}
129+
}
130+
return f[n][k]
131+
}
73132
```
74133

75134
### **...**
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
int waysToDistribute(int n, int k) {
4+
const int mod = 1e9 + 7;
5+
int f[n + 1][k + 1];
6+
memset(f, 0, sizeof(f));
7+
f[0][0] = 1;
8+
for (int i = 1; i <= n; ++i) {
9+
for (int j = 1; j <= k; ++j) {
10+
f[i][j] = (1LL * f[i - 1][j] * j + f[i - 1][j - 1]) % mod;
11+
}
12+
}
13+
return f[n][k];
14+
}
15+
};
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
func waysToDistribute(n int, k int) int {
2+
f := make([][]int, n+1)
3+
for i := range f {
4+
f[i] = make([]int, k+1)
5+
}
6+
f[0][0] = 1
7+
const mod = 1e9 + 7
8+
for i := 1; i <= n; i++ {
9+
for j := 1; j <= k; j++ {
10+
f[i][j] = (f[i-1][j]*j + f[i-1][j-1]) % mod
11+
}
12+
}
13+
return f[n][k]
14+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public int waysToDistribute(int n, int k) {
3+
final int mod = (int) 1e9 + 7;
4+
int[][] f = new int[n + 1][k + 1];
5+
f[0][0] = 1;
6+
for (int i = 1; i <= n; i++) {
7+
for (int j = 1; j <= k; j++) {
8+
f[i][j] = (int) ((long) f[i - 1][j] * j % mod + f[i - 1][j - 1]) % mod;
9+
}
10+
}
11+
return f[n][k];
12+
}
13+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def waysToDistribute(self, n: int, k: int) -> int:
3+
mod = 10**9 + 7
4+
f = [[0] * (k + 1) for _ in range(n + 1)]
5+
f[0][0] = 1
6+
for i in range(1, n + 1):
7+
for j in range(1, k + 1):
8+
f[i][j] = (f[i - 1][j] * j + f[i - 1][j - 1]) % mod
9+
return f[n][k]

0 commit comments

Comments
 (0)