forked from sachuverma/DataStructures-Algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Partition array to K subsets.cpp
75 lines (65 loc) · 1.58 KB
/
Partition array to K subsets.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*
Partition array to K subsets
============================
Given an integer array a[ ] of N elements and an integer K, the task is to check if the array a[ ] could be divided into K non-empty subsets with equal sum of elements.
Note: All elements of this array should be part of exactly one partition.
Example 1:
Input:
N = 5
a[] = {2,1,4,5,6}
K = 3
Output:
1
Explanation: we can divide above array
into 3 parts with equal sum as (2, 4),
(1, 5), (6)
Example 2:
Input:
N = 5
a[] = {2,1,5,5,6}
K = 3
Output:
0
Explanation: It is not possible to divide
above array into 3 parts with equal sum.
Your Task:
You don't need to read input or print anything. Your task is to complete the function isKPartitionPossible() which takes the array a[], the size of the array N, and the value of K as inputs and returns true(same as 1) if possible, otherwise false(same as 0).
Expected Time Complexity: O(N*2N).
Expected Auxiliary Space: O(2N).
Constraints:
1 ≤ K ≤ N ≤ 10
1 ≤ a[i] ≤ 100
*/
bool dfs(int a[], int j, int k, int n, int vis[], int t, int c)
{
if (c > t)
return false;
if (j == k)
return true;
if (c == t)
{
return dfs(a, j + 1, k, n, vis, t, 0);
}
for (int l = 0; l < n; ++l)
{
if (!vis[l])
{
vis[l] = 1;
if (dfs(a, j, k, n, vis, t, c + a[l]))
return true;
vis[l] = 0;
}
}
return false;
}
bool isKPartitionPossible(int a[], int n, int k)
{
int sum = 0;
for (int i = 0; i < n; ++i)
sum += a[i];
if (sum % k != 0)
return false;
int target = sum / k;
int vis[n] = {0};
return dfs(a, 0, k, n, vis, target, 0);
}