Maximize number of elements from Array with sum at most K

Given an array A[] of N integers and an integer K, the task is to select maximum number of elements from the array whose sum is at most K.

Examples:

Input: A[] = {1, 12, 5, 111, 200, 1000, 10}, K = 50 
Output:
Explanation: 
Maximum number of selections will be 1, 12, 5, 10 that is 1 + 12 + 5 + 10 = 28 < 50.

Input: A[] = {3, 7, 2, 9, 4}, K = 15 
Output:
Explanation: 
Maximum number of selections will be 3, 2, 4 that is 3 + 2 + 4 =9 < 15.

Naive Approach: The idea is to generate all possible subsequences of the array and find the sum of elements of all the subsequences generated. Find the subsequence with maximum length and with the sum less than or equal to K
Time Complexity: O(2N
Auxiliary Space: (1)

Efficient Approach: The efficient approach can be solved using the Greedy Technique. Below are the steps: 



  1. Sort the given array.
  2. Iterate in the array and keep the track of the sum of elements until the sum is less than or equal to K.
  3. If the sum while iterating in the above steps exceeds K then break the loop and print the value of count till that index.

Below is the implementation of the above approach:

C++14

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to select a maximum number of
// elements in array whose sum is at most K
int maxSelections(int A[], int n, int k)
{
    // Sort the array
    sort(A, A + n);
  
    // Calculate the sum and count while
    // iterating the sorted array
    int sum = 0;
    int count = 0;
  
    // Iterate for all the
    // elements in the array
    for (int i = 0; i < n; i++) {
  
        // Add the current element to sum
        sum = sum + A[i];
  
        if (sum > k) {
            break;
        }
  
        // Increment the count
        count++;
    }
    // Return the answer
    return count;
}
  
// Driver Code
int main()
{
    // Given array
    int A[] = { 3, 7, 2, 9, 4 };
  
    // Given sum k
    int k = 15;
    int n = sizeof(A) / sizeof(A[0]);
  
    // Function Call
    cout << maxSelections(A, n, k);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach
import java.util.*;
  
class GFG{
  
// Function to select a maximum number of
// elements in array whose sum is at most K
static int maxSelections(int A[], int n, int k)
{
      
    // Sort the array
    Arrays.sort(A);
  
    // Calculate the sum and count while
    // iterating the sorted array
    int sum = 0;
    int count = 0;
  
    // Iterate for all the
    // elements in the array
    for(int i = 0; i < n; i++)
    {
          
        // Add the current element to sum
        sum = sum + A[i];
  
        if (sum > k)
        {
            break;
        }
  
        // Increment the count
        count++;
    }
      
    // Return the answer
    return count;
}
  
// Driver Code
public static void main(String[] args)
{
      
    // Given array
    int A[] = { 3, 7, 2, 9, 4 };
  
    // Given sum k
    int k = 15;
    int n = A.length;
  
    // Function call
    System.out.print(maxSelections(A, n, k));
}
}
  
// This code is contributed by Rajput-Ji

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for the above approach
using System;
  
class GFG{
  
// Function to select a maximum number of
// elements in array whose sum is at most K
static int maxSelections(int[] A, int n, int k)
{
  
    // Sort the array
    Array.Sort(A);
  
    // Calculate the sum and count while
    // iterating the sorted array
    int sum = 0;
    int count = 0;
  
    // Iterate for all the
    // elements in the array
    for(int i = 0; i < n; i++)
    {
          
        // Add the current element to sum
        sum = sum + A[i];
  
        if (sum > k) 
        {
            break;
        }
  
        // Increment the count
        count++;
    }
  
    // Return the answer
    return count;
}
  
// Driver Code
public static void Main(String[] args)
{
  
    // Given array
    int[] A = { 3, 7, 2, 9, 4 };
  
    // Given sum k
    int k = 15;
    int n = A.Length;
  
    // Function call
    Console.Write(maxSelections(A, n, k));
}
}
  
// This code is contributed by gauravrajput1

chevron_right


Output: 

3

Time Complexity: O(N*log N) 
Auxiliary Space: O(1) 
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Rajput-Ji, GauravRajput1