File tree Expand file tree Collapse file tree 1 file changed +50
-0
lines changed Expand file tree Collapse file tree 1 file changed +50
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number[] } nums
3
+ * @param {number[] } quantity
4
+ * @return {boolean }
5
+ */
6
+ const canDistribute = function ( nums , quantity ) {
7
+ const freq = new Map ( )
8
+ for ( const e of nums ) {
9
+ freq . set ( e , ( freq . get ( e ) || 0 ) + 1 )
10
+ }
11
+ const cntArr = [ ...freq . values ( ) ]
12
+ const dp = Array . from ( { length : 51 } , ( ) => Array ( 1024 ) . fill ( false ) )
13
+ const n = cntArr . length , m = quantity . length
14
+ for ( let i = 0 ; i < n ; i ++ ) {
15
+ dp [ i ] [ 0 ] = true
16
+ }
17
+ cntArr . unshift ( 0 )
18
+ const allMask = ( 1 << m ) - 1
19
+
20
+ for ( let i = 1 ; i <= n ; i ++ ) {
21
+ for ( let mask = 1 ; mask <= allMask ; mask ++ ) {
22
+ if ( dp [ i - 1 ] [ mask ] ) {
23
+ dp [ i ] [ mask ] = true
24
+ continue
25
+ }
26
+ for ( let subset = mask ; subset > 0 ; subset = ( subset - 1 ) & mask ) {
27
+ if ( dp [ i - 1 ] [ mask - subset ] === false ) continue
28
+ if ( canSatisfySubset ( cntArr [ i ] , subset ) ) {
29
+ dp [ i ] [ mask ] = true
30
+ break
31
+ }
32
+ }
33
+ }
34
+ }
35
+
36
+ return dp [ n ] [ allMask ]
37
+
38
+ function canSatisfySubset ( cnt , subset ) {
39
+ let sum = 0
40
+ for ( let i = 0 ; i < 10 ; i ++ ) {
41
+ if ( subset & ( 1 << i ) ) {
42
+ sum += quantity [ i ]
43
+ }
44
+ }
45
+ return cnt >= sum
46
+ }
47
+ } ;
48
+
49
+ // another
50
+
1
51
/**
2
52
* @param {number[] } nums
3
53
* @param {number[] } quantity
You can’t perform that action at this time.
0 commit comments