Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace _5.Problem_SubsetSums
- {
- class Program
- {
- static void Main()
- {
- bool isLong = true;
- byte elementsEqualToS = 0;
- long S = long.Parse(Console.ReadLine());
- int N = int.Parse(Console.ReadLine());
- long[] longNumbers = new long[N];
- if (N > 0 && N < 17)
- {
- for (int i = 0; i < N; i++)
- {
- isLong = long.TryParse(Console.ReadLine(), out longNumbers[i]);
- if (isLong == false)
- {
- break;
- }
- if (longNumbers[i] == S)
- {
- elementsEqualToS++;
- }
- }
- if (isLong)
- {
- Console.WriteLine(FindSubsetSum(longNumbers, S) + elementsEqualToS);
- }
- else
- {
- Console.WriteLine("Wrong entry! Some of the numbers are not long!");
- }
- }
- else
- {
- Console.WriteLine("Wrong entry! The members of the sequence are not between 1 and 16!");
- }
- }
- private static int FindSubsetSum(long[] numbers, long S)
- {
- int numberOfSubsets = 0;
- int allSubsets = (int)Math.Pow(2, numbers.Length);
- long[] dynamicSums = new long[allSubsets];
- for (int i = 1; i < numbers.Length; i++)// numbers in the array
- {
- int j, k;
- for (j = 0; j < ((1 << i) - (i + 1)); j++)// the sum with already summed elements
- {
- if ((dynamicSums[(1 << i) - (i + 1) + j] = numbers[i] + dynamicSums[j]) == S)
- {
- numberOfSubsets++;
- }
- }
- for (k = 0; k < i; k++)// the sums with the new elements
- {
- if ((dynamicSums[(1 << i) - (i + 1) + (j + k)] = numbers[k] + numbers[i]) == S)
- {
- numberOfSubsets++;
- }
- }
- }
- return numberOfSubsets;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement