Form smallest number using indices of numbers chosen from Array with sum less than S

Given an array arr[] and an integer S, the task is to choose the maximum count of numbers from the array such that the sum of numbers is less than S and form the smallest possible number using their indices
Note: Any element can be chosen any number of times. 

Examples: 

Input: arr[] = {3, 4, 2, 4, 6, 5, 4, 2, 3}, S = 13 
Output: 133333 
Explanation: 
Elements chosen – 3 + 2 + 2 + 2 + 2 + 2 = 13 
Therefore, Concatenation of indices – 133333

Input: arr[] = {18, 21, 22, 51, 13, 14, 17, 15, 17}, S = 50 
Output: 115 
 

Approach: The idea is to find the maximum count of the elements that can be chosen which can be computed for the number using 



\frac{Sum}{X}

Finally, the minimum indices that can choose multiple times are computed by taking the minimum digit in the number for each digit place.

Below is the implementation of the above approach: 

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation to find
// minimum number which
// have a maximum length
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the
// minimum number which
// have maximum length
string max_number(int arr[], int sum)
{
    int frac[9];
    int maxi = INT_MIN;
    string ans;
    int pos;
 
    // Find Maximum length
    // of number
    for (int i = 0; i < 9; i++) {
        frac[i] = sum / arr[i];
        if (frac[i] > maxi) {
            pos = i;
            maxi = frac[i];
        }
    }
 
    ans.insert(0,
               string(maxi,
                      (pos + 1) + '0'));
    sum -= maxi * arr[pos];
 
    // Find minimum number WHich
    // have maximum length
    for (int i = 0; i < maxi; i++) {
        for (int j = 1; j <= 9; j++) {
 
            if (sum
                    + arr[pos]
                    - arr[j - 1]
                >= 0) {
 
                ans[i] = (j + '0');
                sum += arr[pos]
                       - arr[j - 1];
                break;
            }
        }
    }
 
    if (maxi == 0) {
        return 0;
    }
    else {
        return ans;
    }
}
 
// Driver Code
int main()
{
    int arr[9] = { 3, 4, 2, 4, 6,
                   5, 4, 2, 3 };
    int s = 13;
    cout << max_number(arr, s);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation to find
// minimum number which
// have a maximum length
class GFG{
 
// Function to find the
// minimum number which
// have maximum length
static String max_number(int arr[], int sum)
{
    int frac[] = new int[9];
    int maxi = Integer.MIN_VALUE;
     
    StringBuilder ans = new StringBuilder();
    int pos = 0;
 
    // Find Maximum length
    // of number
    for(int i = 0; i < 9; i++)
    {
        frac[i] = sum / arr[i];
        if (frac[i] > maxi)
        {
            pos = i;
            maxi = frac[i];
        }
    }
 
    for(int i = 0; i < maxi; i++)
    {
        ans.append((char)((pos + 1) + '0'));
    }
 
    sum -= maxi * arr[pos];
 
    // Find minimum number WHich
    // have maximum length
    for(int i = 0; i < maxi; i++)
    {
        for(int j = 1; j <= 9; j++)
        {
            if (sum + arr[pos] - arr[j - 1] >= 0)
            {
                ans.setCharAt(i, (char)(j + '0'));
         
                sum += arr[pos] - arr[j - 1];
                break;
            }
        }
    }
     
    if (maxi == 0)
    {
        return "0";
    }
    else
    {
        return ans.toString();
    }
}
 
// Driver Code
public static void main(String str[])
{
    int arr[] = { 3, 4, 2, 4, 6,
                  5, 4, 2, 3 };
    int s = 13;
     
    System.out.println(max_number(arr, s));
}
}
 
// This code is contributed by rutvik_56

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation to find
# minimum number which
# have a maximum length
 
# Function to find the
# minimum number which
# have maximum length
def max_number(arr, sum):
     
    frac = [0]*9
    maxi = -10**9
 
    pos = 0
     
    # Find Maximum length
    # of number
    for i in range(9):
        frac[i] = sum // arr[i]
         
        if (frac[i] > maxi):
            pos = i
            maxi = frac[i]
 
    an = str((pos + 1)) * maxi
     
    #print(an)
    sum -= maxi * arr[pos]
 
    ans = [i for i in an]
 
    # Find minimum number WHich
    # have maximum length
    for i in range(maxi):
        for j in range(1, 10):
            if (sum + arr[pos] - arr[j - 1] >= 0):
                ans[i] = str(j)
                sum += arr[pos] - arr[j - 1]
                break
 
    if (maxi == 0):
        return 0
    else:
        return "".join(ans)
 
# Driver Code
if __name__ == '__main__':
     
    arr = [ 3, 4, 2, 4, 6,
            5, 4, 2, 3 ]
    s = 13
     
    print(max_number(arr, s))
 
# This code is contributed by mohit kumar 29

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation to find
// minimum number which
// have a maximum length
using System;
using System.Text;
class GFG{
 
// Function to find the
// minimum number which
// have maximum length
static String max_number(int []arr,
                         int sum)
{
  int []frac = new int[9];
  int maxi = int.MinValue;
  StringBuilder ans =
                new StringBuilder();
  int pos = 0;
 
  // Find Maximum length
  // of number
  for(int i = 0; i < 9; i++)
  {
    frac[i] = sum / arr[i];
    if (frac[i] > maxi)
    {
      pos = i;
      maxi = frac[i];
    }
  }
 
  for(int i = 0; i < maxi; i++)
  {
    ans.Append((char)((pos + 1) + '0'));
  }
  sum -= maxi * arr[pos];
 
  // Find minimum number WHich
  // have maximum length
  for(int i = 0; i < maxi; i++)
  {
    for(int j = 1; j <= 9; j++)
    {
      if (sum + arr[pos] -
          arr[j - 1] >= 0)
      {
        ans[i] = (char)(j + '0');
 
        sum += arr[pos] - arr[j - 1];
        break;
      }
    }
  }
 
  if (maxi == 0)
  {
    return "0";
  }
  else
  {
    return ans.ToString();
  }
}
 
// Driver Code
public static void Main(String []str)
{
  int []arr = {3, 4, 2, 4, 6,
               5, 4, 2, 3};
  int s = 13;
  Console.WriteLine(max_number(arr, s));
}
}
 
// This code is contributed by 29AjayKumar

chevron_right


Output: 

133333





 

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

Code and Let Code

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.