给定大小为N的数组和总和,任务是检查是否可以添加一些数组元素以将总和添加到N。
注意:至少应包含一个元素以形成总和。(即总和不能为零)
例子:
Input: array = -1, 2, 4, 121, N = 5
Output: YES
The array elements 2, 4, -1 can be added to sum to N
Input: array = 1, 3, 7, 121, N = 5
Output:NO
方法:想法是使用“生成数组的所有子序列”生成所有子集,并相应地检查是否有任何子序列的总和等于给定的总和。
下面是上述方法的实现:
CPP
// C++ implementation of the above approach
#include
using namespace std;
// Find way to sum to N using array elements atmost once
void find(int arr[], int length, int s)
{
// loop for all 2^n combinations
for (int i = 1; i < (pow(2, length)); i++) {
// sum of a combination
int sum = 0;
for (int j = 0; j < length; j++)
// if the bit is 1 then add the element
if (((i >> j) & 1))
sum += arr[j];
// if the sum is equal to given sum print yes
if (sum == s) {
cout << "YES" << endl;
return;
}
}
// else print no
cout << "NO" << endl;
}
// driver code
int main()
{
int sum = 5;
int array[] = { -1, 2, 4, 121 };
int length = sizeof(array) / sizeof(int);
// find whether it is possible to sum to n
find(array, length, sum);
return 0;
}
Java
// Java implementation of the above approach
class GFG
{
// Find way to sum to N using array elements atmost once
static void find(int [] arr, int length, int s)
{
// loop for all 2^n combinations
for (int i = 1; i <= (Math.pow(2, length)); i++) {
// sum of a combination
int sum = 0;
for (int j = 0; j < length; j++)
// if the bit is 1 then add the element
if (((i >> j) & 1) % 2 == 1)
sum += arr[j];
// if the sum is equal to given sum print yes
if (sum == s) {
System.out.println("YES");
return;
}
}
// else print no
System.out.println("NO");
}
// driver code
public static void main(String[] args)
{
int sum = 5;
int []array = { -1, 2, 4, 121 };
int length = array.length;
// find whether it is possible to sum to n
find(array, length, sum);
}
}
// This code is contributed by ihritik
Python3
# Python3 implementation
from itertools import combinations
def find(lst, n):
print('YES' if [1 for r in range(1, len(lst) + 1)
for subset in combinations(lst, r)
if sum(subset) == n] else 'NO')
find([-1, 2, 4, 121], 5)
#This code is contributed by signi dimitri
C#
// C# implementation of the above approach
using System;
public class GFG
{
// Find way to sum to N using array elements atmost once
static void find(int [] arr, int length, int s)
{
// loop for all 2^n combinations
for (int i = 1; i <= (Math.Pow(2, length)); i++) {
// sum of a combination
int sum = 0;
for (int j = 0; j < length; j++)
// if the bit is 1 then add the element
if (((i >> j) & 1) % 2 == 1)
sum += arr[j];
// if the sum is equal to given sum print yes
if (sum == s) {
Console.Write("YES");
return;
}
}
// else print no
Console.Write("NO");
}
// driver code
public static void Main()
{
int sum = 5;
int []array = { -1, 2, 4, 121 };
int length = array.Length;
// find whether it is possible to sum to n
find(array, length, sum);
}
}
// This code is contributed by PrinciRaj19992
PHP
> $j) & 1))
$sum += $arr[$j];
// if the sum is equal to given sum print yes
if ($sum == $s)
{
echo "YES","\n";
return;
}
}
// else print no
echo "NO","\n";
}
// Driver code
$sum = 5;
$array = array(-1, 2, 4, 121 );
$length = sizeof($array) / sizeof($array[0]);
// find whether it is possible to sum to n
find($array, $length, $sum);
// This code is contributed by ajit.
?>
输出:
YES
注意:该程序无法在大型阵列上运行。