Print all possible ways to split an array into K subsets
Last Updated :
26 Dec, 2022
Given an array arr[] of size N and an integer K, the task is to print all possible ways to split the given array into K subsets.
Examples:
Input: arr[] = { 1, 2, 3 }, K = 2
Output: { {{ 1, 2 }, { 3 }}, {{ 1, 3 }, { 2 }}, {{ 1 }, { 2, 3 }}}.
Input: arr[] = { 1, 2, 3, 4 }, K = 2
Output: { {{ 1, 2, 3 }, { 4 }}, {{ 1, 2, 4 }, { 3 }}, {{ 1, 2 }, { 3, 4 }}, {{ 1, 3, 4 }, { 2 }}, {{ 1, 3 }, { 2, 4 }}, {{ 1, 4 }, { 2, 3 }}, {{ 1 }, { 2 3, 4 }} }
Approach: The problem can be solved using backtracking to generate and print all the subsets. Follow the steps below to solve the problem:
- Traverse the array and insert elements into any one of the K subsets using the following recurrence relation:
PartitionSub(i, K, N)
{
for (j = 0; j < K; j++) {
sub[j].push_back(arr[i])
PartitionSub(i + 1, K, N)
sub[j].pop_back()
}
}
-
- If K is equal to 0 or K > N, then subsets cannot be generated.
- If count of array elements inserted into K subsets equal to N, then print the elements of the subset.
C++
#include <bits/stdc++.h>
using namespace std;
void PartitionSub( int arr[], int i,
int N, int K, int nos,
vector<vector< int > >& v)
{
if (i >= N) {
if (nos == K) {
for ( int x = 0; x < v.size(); x++) {
cout << "{ " ;
for ( int y = 0; y < v[x].size(); y++) {
cout << v[x][y];
if (y == v[x].size() - 1) {
cout << " " ;
}
else {
cout << ", " ;
}
}
if (x == v.size() - 1) {
cout << "}" ;
}
else {
cout << "}, " ;
}
}
cout << endl;
}
return ;
}
for ( int j = 0; j < K; j++) {
if (v[j].size() > 0) {
v[j].push_back(arr[i]);
PartitionSub(arr, i + 1, N, K, nos, v);
v[j].pop_back();
}
else {
v[j].push_back(arr[i]);
PartitionSub(arr, i + 1, N, K, nos + 1, v);
v[j].pop_back();
break ;
}
}
}
void partKSubsets( int arr[], int N, int K)
{
vector<vector< int > > v(K);
if (K == 0 || K > N) {
cout << "Not Possible" << endl;
}
else {
cout << "The Subset Combinations are: " << endl;
PartitionSub(arr, 0, N, K, 0, v);
}
}
int main()
{
int arr[] = { 1, 2, 3, 4 };
int K = 2;
int N = sizeof (arr) / sizeof (arr[0]);
partKSubsets(arr, N, K);
}
|
Java
import java.util.*;
import java.lang.*;
class Gfg
{
static void PartitionSub( int arr[], int i,
int N, int K, int nos,
ArrayList<ArrayList<Integer>> v)
{
if (i >= N)
{
if (nos == K)
{
for ( int x = 0 ; x < v.size(); x++)
{
System.out.print( "{ " );
for ( int y = 0 ; y < v.get(x).size(); y++)
{
System.out.print(v.get(x).get(y));
if (y == v.get(x).size() - 1 )
{
System.out.print( " " );
}
else
{
System.out.print( ", " );
}
}
if (x == v.size() - 1 )
{
System.out.print( "}" );
}
else
{
System.out.print( "}, " );
}
}
System.out.println();;
}
return ;
}
for ( int j = 0 ; j < K; j++)
{
if (v.get(j).size() > 0 )
{
v.get(j).add(arr[i]);
PartitionSub(arr, i + 1 , N, K, nos, v);
v.get(j).remove(v.get(j).size()- 1 );
}
else
{
v.get(j).add(arr[i]);
PartitionSub(arr, i + 1 , N, K, nos + 1 , v);
v.get(j).remove(v.get(j).size()- 1 );
break ;
}
}
}
static void partKSubsets( int arr[], int N, int K)
{
ArrayList<ArrayList<Integer>> v = new ArrayList<>();
for ( int i = 0 ; i < K; i++)
v.add( new ArrayList<>());
if (K == 0 || K > N)
{
System.out.println( "Not Possible" );
}
else
{
System.out.println( "The Subset Combinations are: " );
PartitionSub(arr, 0 , N, K, 0 , v);
}
}
public static void main (String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 };
int K = 2 ;
int N = arr.length;
partKSubsets(arr, N, K);
}
}
|
Python3
def PartitionSub(arr, i, N, K, nos, v):
if (i > = N):
if (nos = = K):
for x in range ( len (v)):
print ( "{ " , end = "")
for y in range ( len (v[x])):
print (v[x][y], end = "")
if (y = = len (v[x]) - 1 ):
print ( " " , end = "")
else :
print ( ", " , end = "")
if (x = = len (v) - 1 ):
print ( "}" , end = "")
else :
print ( "}, " , end = "")
print ( "\n" , end = "")
return
for j in range (K):
if ( len (v[j]) > 0 ):
v[j].append(arr[i])
PartitionSub(arr, i + 1 , N, K, nos, v)
v[j].remove(v[j][ len (v[j]) - 1 ])
else :
v[j].append(arr[i])
PartitionSub(arr, i + 1 , N, K, nos + 1 , v)
v[j].remove(v[j][ len (v[j]) - 1 ])
break
def partKSubsets(arr, N, K):
v = [[] for i in range (K)]
if (K = = 0 or K > N):
print ( "Not Possible" , end = "")
else :
print ( "The Subset Combinations are: " )
PartitionSub(arr, 0 , N, K, 0 , v)
if __name__ = = '__main__' :
arr = [ 1 , 2 , 3 , 4 ]
K = 2
N = len (arr)
partKSubsets(arr, N, K)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void PartitionSub( int []arr, int i,
int N, int K, int nos,
List<List< int >>v)
{
if (i >= N) {
if (nos == K) {
for ( int x = 0; x < v.Count; x++) {
Console.Write( "{ " );
for ( int y = 0; y < v[x].Count; y++) {
Console.Write(v[x][y]);
if (y == v[x].Count - 1) {
Console.Write( " " );
}
else {
Console.Write( ", " );
}
}
if (x == v.Count - 1) {
Console.Write( "}" );
}
else {
Console.Write( "}, " );
}
}
Console.Write( "\n" );
}
return ;
}
for ( int j = 0; j < K; j++) {
if (v[j].Count > 0) {
v[j].Add(arr[i]);
PartitionSub(arr, i + 1, N, K, nos, v);
v[j].RemoveAt(v[j].Count - 1);
}
else {
v[j].Add(arr[i]);
PartitionSub(arr, i + 1, N, K, nos + 1, v);
v[j].RemoveAt(v[j].Count - 1);
break ;
}
}
}
static void partKSubsets( int []arr, int N, int K)
{
List<List< int > > v = new List<List< int >>();
for ( int i=0;i<K;i++)
v.Add( new List< int >());
if (K == 0 || K > N) {
Console.WriteLine( "Not Possible" );
}
else {
Console.WriteLine( "The Subset Combinations are: " );
PartitionSub(arr, 0, N, K, 0, v);
}
}
public static void Main()
{
int []arr = {1, 2, 3, 4};
int K = 2;
int N = arr.Length;
partKSubsets(arr, N, K);
}
}
|
Javascript
<script>
function PartitionSub(arr, i, N, K, nos, v)
{
if (i >= N)
{
if (nos == K)
{
for (let x = 0; x < v.length; x++)
{
document.write( "{ " );
for (let y = 0; y < v[x].length; y++)
{
document.write(v[x][y]);
if (y == v[x].length - 1)
{
document.write( " " );
}
else
{
document.write( ", " );
}
}
if (x == v.length - 1)
{
document.write( "}" );
}
else
{
document.write( "}, " );
}
}
document.write( "</br>" );
}
return ;
}
for (let j = 0; j < K; j++)
{
if (v[j].length > 0)
{
v[j].push(arr[i]);
PartitionSub(arr, i + 1, N, K, nos, v);
v[j].pop();
}
else
{
v[j].push(arr[i]);
PartitionSub(arr, i + 1, N, K, nos + 1, v);
v[j].pop();
break ;
}
}
}
function partKSubsets(arr, N, K)
{
let v = [];
for (let i = 0; i < K; i++)
v.push([]);
if (K == 0 || K > N)
{
document.write( "Not Possible" + "</br>" );
}
else
{
document.write( "The Subset Combinations are: " + "</br>" );
PartitionSub(arr, 0, N, K, 0, v);
}
}
let arr = [ 1, 2, 3, 4 ];
let K = 2;
let N = arr.length;
partKSubsets(arr, N, K);
</script>
|
Output
The Subset Combinations are:
{ 1, 2, 3 }, { 4 }
{ 1, 2, 4 }, { 3 }
{ 1, 2 }, { 3, 4 }
{ 1, 3, 4 }, { 2 }
{ 1, 3 }, { 2, 4 }
{ 1, 4 }, { 2, 3 }
{ 1 }, { 2, 3, 4 }
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...