How to determine if sum of subset of an int array is equal to a given number in C

3 Answers

0 votes
// A c program to determine if sum of subset of an int array is equal to a given number 

#include <stdio.h>
#include <stdbool.h>

bool inArrSubsetOfSum(int arr[], int len, int sum)
{
   if (sum == 0)
     return true;
   if (len == 0 && sum != 0)
     return false;
 
   if (arr[len-1] > sum)
     return inArrSubsetOfSum(arr, len-1, sum);
 
   return inArrSubsetOfSum(arr, len-1, sum) || inArrSubsetOfSum(arr, len-1, sum - arr[len-1]);
}
 
int main(void)
{
  int arr[] = {1, 6, 5, 14, 3, 4}; // 6 + 4 = 10 (sum)
  int sum = 10;
  int len = sizeof(arr)/sizeof(arr[0]);
  
  if (inArrSubsetOfSum(arr, len, sum) == true)
     printf("Found");
  else
     printf("Not found");
     
  return 0;
}
  

/*
run:

Found

*/

 



answered Jul 7, 2017 by avibootz
0 votes
// A c program to determine if sum of subset of an int array is equal to a given number 

#include <stdio.h>
#include <stdbool.h>

bool inArrSubsetOfSum(int arr[], int len, int sum)
{
   if (sum == 0)
     return true;
   if (len == 0 && sum != 0)
     return false;
 
   if (arr[len-1] > sum)
     return inArrSubsetOfSum(arr, len-1, sum);
 
   return inArrSubsetOfSum(arr, len-1, sum) || inArrSubsetOfSum(arr, len-1, sum - arr[len-1]);
}
 
int main(void)
{
  int arr[] = {1, 6, 5, 14, 3, 4}; // 1 + 5 + 3 + 4 = 13 (sum)
  int sum = 13;
  int len = sizeof(arr)/sizeof(arr[0]);
  
  if (inArrSubsetOfSum(arr, len, sum) == true)
     printf("Found");
  else
     printf("Not found");
     
  return 0;
}
  

/*
run:

Found

*/

 



answered Jul 7, 2017 by avibootz
0 votes
// A c program to determine if sum of subset of an int array is equal to a given number 
// With Simulation
 
#include <stdio.h>
#include <stdbool.h>
 
bool inArrSubsetOfSum(int arr[], int len, int sum)
{
   printf("len = %d sum = %d\n", len, sum);
   if (sum == 0)
   {
       printf("return true\n");
       return true;
   }
   if (len == 0 && sum != 0)
   {
       printf("return false\n");
       return false;
   }
   if (arr[len-1] > sum)
   {
        printf("(if) inArrSubsetOfSum(arr, %d, %d)\n", len-1, sum);
        return inArrSubsetOfSum(arr, len-1, sum);
   }
   
   printf("inArrSubsetOfSum(arr, %d, %d) || inArrSubsetOfSum(arr, %d, %d(arr[len-1]=%d))\n", 
           len-1, sum, len-1, sum - arr[len-1], arr[len-1]); 
   return inArrSubsetOfSum(arr, len-1, sum) || inArrSubsetOfSum(arr, len-1, sum - arr[len-1]);
}
  
int main(void)
{
  int arr[] = {1, 6, 5, 14, 3, 4}; // 6 + 4 = 10 (sum)
  int sum = 10;
  int len = sizeof(arr)/sizeof(arr[0]);
  printf("len = %d\n", len);
   
  if (inArrSubsetOfSum(arr, len, sum) == true)
     printf("Found");
  else
     printf("Not found");
      
  return 0;
}
   
 
/*
run:
 
len = 6
len = 6 sum = 10
inArrSubsetOfSum(arr, 5, 10) || inArrSubsetOfSum(arr, 5, 6(arr[len-1]=4))
len = 5 sum = 10
inArrSubsetOfSum(arr, 4, 10) || inArrSubsetOfSum(arr, 4, 7(arr[len-1]=3))
len = 4 sum = 10
(if) inArrSubsetOfSum(arr, 3, 10)
len = 3 sum = 10
inArrSubsetOfSum(arr, 2, 10) || inArrSubsetOfSum(arr, 2, 5(arr[len-1]=5))
len = 2 sum = 10
inArrSubsetOfSum(arr, 1, 10) || inArrSubsetOfSum(arr, 1, 4(arr[len-1]=6))
len = 1 sum = 10
inArrSubsetOfSum(arr, 0, 10) || inArrSubsetOfSum(arr, 0, 9(arr[len-1]=1))
len = 0 sum = 10
return false
len = 0 sum = 9
return false
len = 1 sum = 4
inArrSubsetOfSum(arr, 0, 4) || inArrSubsetOfSum(arr, 0, 3(arr[len-1]=1))
len = 0 sum = 4
return false
len = 0 sum = 3
return false
len = 2 sum = 5
(if) inArrSubsetOfSum(arr, 1, 5)
len = 1 sum = 5
inArrSubsetOfSum(arr, 0, 5) || inArrSubsetOfSum(arr, 0, 4(arr[len-1]=1))
len = 0 sum = 5
return false
len = 0 sum = 4
return false
len = 4 sum = 7
(if) inArrSubsetOfSum(arr, 3, 7)
len = 3 sum = 7
inArrSubsetOfSum(arr, 2, 7) || inArrSubsetOfSum(arr, 2, 2(arr[len-1]=5))
len = 2 sum = 7
inArrSubsetOfSum(arr, 1, 7) || inArrSubsetOfSum(arr, 1, 1(arr[len-1]=6))
len = 1 sum = 7
inArrSubsetOfSum(arr, 0, 7) || inArrSubsetOfSum(arr, 0, 6(arr[len-1]=1))
len = 0 sum = 7
return false
len = 0 sum = 6
return false
len = 1 sum = 1
inArrSubsetOfSum(arr, 0, 1) || inArrSubsetOfSum(arr, 0, 0(arr[len-1]=1))
len = 0 sum = 1
return false
len = 0 sum = 0
return true
Found
 
*/

 



answered Jul 8, 2017 by avibootz
...