本文概述
- C ++
- Java
- Python3
- C#
- 的PHP
【如何使用递归实现打印给定总和的所有子集()】例子:
Input :arr[] ={2, 5, 8, 4, 6, 11}, sum = 13
Output :
5 8
2 11
2 5 6Input : arr[] ={1, 5, 8, 4, 6, 11}, sum = 9
Output :
5 4
1 8
这个问题是:检查是否有给定总和的子集。我们递归生成所有子集。我们跟踪当前子集的元素。如果当前子集中的元素总和等于给定总和, 我们将打印该子集。
C ++
// CPP program to print all subsets with given sum
#include <
bits/stdc++.h>
using namespace std;
// The vector v stores current subset.
void printAllSubsetsRec( int arr[], int n, vector<
int >
v, int sum)
{
// If remaining sum is 0, then print all
// elements of current subset.
if (sum == 0) {
for ( auto x : v)
cout <
<
x <
<
" " ;
cout <
<
endl;
return ;
}// If no remaining elements, if (n == 0)
return ;
// We consider two cases for every element.
// a) We do not include last element.
// b) We include last element in current subset.
printAllSubsetsRec(arr, n - 1, v, sum);
v.push_back(arr[n - 1]);
printAllSubsetsRec(arr, n - 1, v, sum - arr[n - 1]);
}// Wrapper over printAllSubsetsRec()
void printAllSubsets( int arr[], int n, int sum)
{
vector<
int >
v;
printAllSubsetsRec(arr, n, v, sum);
}// Driver code
int main()
{
int arr[] = { 2, 5, 8, 4, 6, 11 };
int sum = 13;
int n = sizeof (arr) / sizeof (arr[0]);
printAllSubsets(arr, n, sum);
return 0;
}
Java
// Java program to print all subsets with given sum
import java.util.*;
class Solution
{// The vector v stores current subset.
static void printAllSubsetsRec( int arr[], int n, Vector<
Integer>
v, int sum)
{
// If remaining sum is 0, then print all
// elements of current subset.
if (sum == 0 ) {
for ( int i= 0 ;
i<
v.size();
i++)
System.out.print( v.get(i) + " " );
System.out.println();
return ;
} // If no remaining elements, if (n == 0 )
return ;
// We consider two cases for every element.
// a) We do not include last element.
// b) We include last element in current subset.
printAllSubsetsRec(arr, n - 1 , v, sum);
Vector<
Integer>
v1= new Vector<
Integer>
(v);
v1.add(arr[n - 1 ]);
printAllSubsetsRec(arr, n - 1 , v1, sum - arr[n - 1 ]);
} // Wrapper over printAllSubsetsRec()
static void printAllSubsets( int arr[], int n, int sum)
{
Vector<
Integer>
v= new Vector<
Integer>
();
printAllSubsetsRec(arr, n, v, sum);
} // Driver code
public static void main(String args[])
{
int arr[] = { 2 , 5 , 8 , 4 , 6 , 11 };
int sum = 13 ;
int n = arr.length;
printAllSubsets(arr, n, sum);
}
}
//contributed by Arnab Kundu
Python3
# Python program to print all subsets with given sum# The vector v stores current subset.
def printAllSubsetsRec(arr, n, v, sum ) :# If remaining sum is 0, then print all
# elements of current subset.
if ( sum = = 0 ) :
for value in v :
print (value, end = " " )
print ()
return# If no remaining elements, if (n = = 0 ):
return# We consider two cases for every element.
# a) We do not include last element.
# b) We include last element in current subset.
printAllSubsetsRec(arr, n - 1 , v, sum )
v1 = [] + v
v1.append(arr[n - 1 ])
printAllSubsetsRec(arr, n - 1 , v1, sum - arr[n - 1 ])# Wrapper over printAllSubsetsRec()
def printAllSubsets(arr, n, sum ):v = []
printAllSubsetsRec(arr, n, v, sum )# Driver codearr = [ 2 , 5 , 8 , 4 , 6 , 11 ]
sum = 13
n = len (arr)
printAllSubsets(arr, n, sum )# This code is contributed by ihritik
C#
// C# program to print all subsets with given sum
using System;
using System.Collections.Generic;
class GFG
{
// The vector v stores current subset.
static void printAllSubsetsRec( int []arr, int n, List<
int >
v, int sum)
{
// If remaining sum is 0, then print all
// elements of current subset.
if (sum == 0)
{
for ( int i = 0;
i <
v.Count;
i++)
Console.Write( v[i]+ " " );
Console.WriteLine();
return ;
} // If no remaining elements, if (n == 0)
return ;
// We consider two cases for every element.
// a) We do not include last element.
// b) We include last element in current subset.
printAllSubsetsRec(arr, n - 1, v, sum);
List<
int >
v1 = new List<
int >
(v);
v1.Add(arr[n - 1]);
printAllSubsetsRec(arr, n - 1, v1, sum - arr[n - 1]);
} // Wrapper over printAllSubsetsRec()
static void printAllSubsets( int []arr, int n, int sum)
{
List<
int >
v = new List<
int >
();
printAllSubsetsRec(arr, n, v, sum);
} // Driver code
public static void Main()
{
int []arr = { 2, 5, 8, 4, 6, 11 };
int sum = 13;
int n = arr.Length;
printAllSubsets(arr, n, sum);
}
} // This code is contributed by Rajput-Ji
的PHP
<
?php
// PHP program to print all subsets with given sum// The vector v stores current subset.
function printAllSubsetsRec( $arr , $n , $v , $sum )
{
// If remaining sum is 0, then print all
// elements of current subset.
if ( $sum == 0)
{
for ( $i = 0;
$i <
count ( $v );
$i ++)
echo $v [ $i ] . " " ;
echo "\n" ;
return ;
}// If no remaining elements, if ( $n == 0)
return ;
// We consider two cases for every element.
// a) We do not include last element.
// b) We include last element in current subset.
printAllSubsetsRec( $arr , $n - 1, $v , $sum );
array_push ( $v , $arr [ $n - 1]);
printAllSubsetsRec( $arr , $n - 1, $v , $sum - $arr [ $n - 1]);
}// Wrapper over printAllSubsetsRec()
function printAllSubsets( $arr , $n , $sum )
{
$v = array ();
printAllSubsetsRec( $arr , $n , $v , $sum );
}// Driver code
$arr = array ( 2, 5, 8, 4, 6, 11 );
$sum = 13;
$n = count ( $arr );
printAllSubsets( $arr , $n , $sum );
// This code is contributed by mits
?>
输出如下:
8 5
6 5 2
11 2
时间复杂度:O(2^n)
请参考下面的帖子, 以获得基于动态编程的优化解决方案。
使用动态编程打印给定总和的所有子集
推荐阅读
- Python中如何实现密码验证(两种方法)
- 图的深度优先搜索或DFS算法如何实现()
- C/C++中的函数如何使用(通俗解释和代码示例)
- jQuery如何使用bind()方法(代码示例)
- 移除最小数量的元素,使两个数组中不存在公共元素
- 苏格兰皇家银行面试经验(校园)
- win10正式版安装最新推荐
- 本图文详细教程教你如何安装windows10的镜像
- win10官网安装最新推荐