51
51
52
52
<!-- 这里可写通用的实现逻辑 -->
53
53
54
- ** 方法一:DFS + 剪枝**
54
+ ** 方法一:回溯 + 剪枝**
55
+
56
+ 我们先对数组 $cookies$ 进行降序排序(减少搜索次数),然后创建一个长度为 $k$ 的数组 $cnt$,用于存储每个孩子分到的饼干数量。另外,用变量 $ans$ 维护当前的最小不公平程度,初始化一个很大的值。
57
+
58
+ 接下来,我们从第一个零食包开始,对于当前零食包 $i$,我们枚举每个孩子 $j$,如果当前零食包中的饼干 $cookies[ i] $ 分给孩子 $j$ 后,使得不公平程度大于等于 $ans$,或者当前孩子已有的饼干数量与前一个孩子相同,那么我们不需要考虑将当前零食包中的饼干分给孩子 $j$,直接跳过(剪枝)。否则,我们将当前零食包中的饼干 $cookies[ i] $ 分给孩子 $j$,然后继续考虑下一个零食包。当我们考虑完所有的零食包后,更新 $ans$ 的值,然后回溯到上一个零食包,继续枚举当前零食包中的饼干分给哪个孩子。
59
+
60
+ 最后,我们返回 $ans$ 即可。
55
61
56
62
<!-- tabs:start -->
57
63
62
68
``` python
63
69
class Solution :
64
70
def distributeCookies (self , cookies : List[int ], k : int ) -> int :
65
- def dfs (u ):
66
- nonlocal ans
67
- if u == len (cookies):
68
- ans = min (ans, max (cnt) )
71
+ def dfs (i ):
72
+ if i >= len (cookies):
73
+ nonlocal ans
74
+ ans = max (cnt)
69
75
return
70
- for i in range (k):
71
- if cnt[i] + cookies[u] < ans:
72
- cnt[i] += cookies[u]
73
- dfs(u + 1 )
74
- cnt[i] -= cookies[u]
76
+ for j in range (k):
77
+ if cnt[j] + cookies[i] >= ans or (j and cnt[j] == cnt[j - 1 ]):
78
+ continue
79
+ cnt[j] += cookies[i]
80
+ dfs(i + 1 )
81
+ cnt[j] -= cookies[i]
75
82
76
83
ans = inf
77
84
cnt = [0 ] * k
85
+ cookies.sort(reverse = True )
78
86
dfs(0 )
79
87
return ans
80
88
```
@@ -86,34 +94,39 @@ class Solution:
86
94
``` java
87
95
class Solution {
88
96
private int [] cookies;
89
- private int k;
90
97
private int [] cnt;
91
- private int ans;
98
+ private int k;
99
+ private int n;
100
+ private int ans = 1 << 30 ;
92
101
93
102
public int distributeCookies (int [] cookies , int k ) {
94
- ans = 0x3f3f3f3f ;
103
+ n = cookies. length;
104
+ cnt = new int [k];
105
+ // 升序排列
106
+ Arrays . sort(cookies);
95
107
this . cookies = cookies;
96
108
this . k = k;
97
- this . cnt = new int [k];
98
- dfs(0 );
109
+ // 这里搜索顺序是 n-1, n-2,...0
110
+ dfs(n - 1 );
99
111
return ans;
100
112
}
101
113
102
- private void dfs (int u ) {
103
- if (u == cookies. length) {
104
- int mx = cnt[0 ];
114
+ private void dfs (int i ) {
115
+ if (i < 0 ) {
116
+ // ans = Arrays.stream(cnt).max().getAsInt();
117
+ ans = 0 ;
105
118
for (int v : cnt) {
106
- mx = Math . max(mx , v);
119
+ ans = Math . max(ans , v);
107
120
}
108
- ans = Math . min(ans, mx);
109
121
return ;
110
122
}
111
- for (int i = 0 ; i < k; ++ i) {
112
- if (cnt[i] + cookies[u] < ans) {
113
- cnt[i] += cookies[u];
114
- dfs(u + 1 );
115
- cnt[i] -= cookies[u];
123
+ for (int j = 0 ; j < k; ++ j) {
124
+ if (cnt[j] + cookies[i] >= ans || (j > 0 && cnt[j] == cnt[j - 1 ])) {
125
+ continue ;
116
126
}
127
+ cnt[j] += cookies[i];
128
+ dfs(i - 1 );
129
+ cnt[j] -= cookies[i];
117
130
}
118
131
}
119
132
}
@@ -124,58 +137,55 @@ class Solution {
124
137
``` cpp
125
138
class Solution {
126
139
public:
127
- vector<int > cookies;
128
- vector<int > cnt;
129
- int k;
130
- int ans;
131
-
132
140
int distributeCookies(vector<int >& cookies, int k) {
133
- ans = 0x3f3f3f3f;
134
- this->cookies = cookies;
135
- this->cnt = vector<int>(k);
136
- this->k = k;
141
+ sort(cookies.rbegin(), cookies.rend());
142
+ int cnt[ k] ;
143
+ memset(cnt, 0, sizeof cnt);
144
+ int n = cookies.size();
145
+ int ans = 1 << 30;
146
+ function<void(int)> dfs = [ &] (int i) {
147
+ if (i >= n) {
148
+ ans = * max_element(cnt, cnt + k);
149
+ return;
150
+ }
151
+ for (int j = 0; j < k; ++j) {
152
+ if (cnt[ j] + cookies[ i] >= ans || (j && cnt[ j] == cnt[ j - 1] )) {
153
+ continue;
154
+ }
155
+ cnt[ j] += cookies[ i] ;
156
+ dfs(i + 1);
157
+ cnt[ j] -= cookies[ i] ;
158
+ }
159
+ };
137
160
dfs(0);
138
161
return ans;
139
162
}
140
-
141
- void dfs (int u) {
142
- if (u == cookies.size()) {
143
- ans = min(ans, * max_element(cnt.begin(), cnt.end()));
144
- return;
145
- }
146
- for (int i = 0; i < k; ++i) {
147
- if (cnt[ i] + cookies[ u] < ans) {
148
- cnt[ i] += cookies[ u] ;
149
- dfs(u + 1);
150
- cnt[ i] -= cookies[ u] ;
151
- }
152
- }
153
- }
154
163
};
155
164
```
156
165
157
166
### **Go**
158
167
159
168
```go
160
169
func distributeCookies(cookies []int, k int) int {
170
+ sort.Sort(sort.Reverse(sort.IntSlice(cookies)))
161
171
cnt := make([]int, k)
162
- ans := 0x3f3f3f3f
172
+ ans := 1 << 30
163
173
var dfs func(int)
164
- dfs = func(u int) {
165
- if u = = len(cookies) {
166
- mx := cnt[0]
174
+ dfs = func(i int) {
175
+ if i > = len(cookies) {
176
+ ans = 0
167
177
for _, v := range cnt {
168
- mx = max(mx , v)
178
+ ans = max(ans , v)
169
179
}
170
- ans = min(ans, mx)
171
180
return
172
181
}
173
- for i := 0; i < k; i++ {
174
- if cnt[i]+cookies[u] < ans {
175
- cnt[i] += cookies[u]
176
- dfs(u + 1)
177
- cnt[i] -= cookies[u]
182
+ for j := 0; j < k; j++ {
183
+ if cnt[j]+cookies[i] >= ans || (j > 0 && cnt[j] == cnt[j-1]) {
184
+ continue
178
185
}
186
+ cnt[j] += cookies[i]
187
+ dfs(i + 1)
188
+ cnt[j] -= cookies[i]
179
189
}
180
190
}
181
191
dfs(0)
@@ -188,19 +198,31 @@ func max(a, b int) int {
188
198
}
189
199
return b
190
200
}
191
-
192
- func min(a, b int) int {
193
- if a < b {
194
- return a
195
- }
196
- return b
197
- }
198
201
```
199
202
200
203
### ** TypeScript**
201
204
202
205
``` ts
203
-
206
+ function distributeCookies(cookies : number [], k : number ): number {
207
+ const cnt = new Array (k ).fill (0 );
208
+ let ans = 1 << 30 ;
209
+ const dfs = (i : number ) => {
210
+ if (i >= cookies .length ) {
211
+ ans = Math .max (... cnt );
212
+ return ;
213
+ }
214
+ for (let j = 0 ; j < k ; ++ j ) {
215
+ if (cnt [j ] + cookies [i ] >= ans || (j && cnt [j ] == cnt [j - 1 ])) {
216
+ continue ;
217
+ }
218
+ cnt [j ] += cookies [i ];
219
+ dfs (i + 1 );
220
+ cnt [j ] -= cookies [i ];
221
+ }
222
+ };
223
+ dfs (0 );
224
+ return ans ;
225
+ }
204
226
```
205
227
206
228
### ** ...**
0 commit comments