📜  通过生成所有子集的子集数组总和

📅  最后修改于: 2021-04-29 12:03:00             🧑  作者: Mango

给定大小为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

注意:该程序无法在大型阵列上运行。