Related Articles
Maximum number of candies that can be bought
• Difficulty Level : Easy
• Last Updated : 04 Apr, 2019

Given an array arr[] of size n where arr[i] is the amount of candies of type i. You have unlimited amount of money. The task is to buy as many candies as possible satisfying the following conditions:
If you buy x(i) candies of type i (clearly, 0 ≤ x(i) ≤ arr[i]), then for all j (1 ≤ j ≤ i) at least one of the following must hold:

1. x(j) < x(i) (you bought less candies of type j than of type i)
2. x(j) = 0 (you bought 0 candies of type j)

Examples:

Input:arr[] = {1, 2, 1, 3, 6}
Output: 10
x[] = {0, 0, 1, 3, 6} where x[i] is the number of candies bought of type i

Input: arr[] = {3, 2, 5, 4, 10}
Output: 20

Input: arr[] = {1, 1, 1, 1}
Output: 1

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: We can use greedy approach and start from the end of the array. If we have taken x candies of the type i + 1 then we can only take min(arr[i], x – 1) candies of type i. If this value is negative, we cannot buy candies of the current type.

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;`` ` `// Function to return the maximum candies``// that can be bought``int` `maxCandies(``int` `arr[], ``int` `n)``{`` ` `    ``// Buy all the candies of the last type``    ``int` `prevBought = arr[n - 1];``    ``int` `candies = prevBought;`` ` `    ``// Starting from second last``    ``for` `(``int` `i = n - 2; i >= 0; i--) {`` ` `        ``// Amount of candies of the current``        ``// type that can be bought``        ``int` `x = min(prevBought - 1, arr[i]);`` ` `        ``if` `(x >= 0) {`` ` `            ``// Add candies of current type``            ``// that can be bought``            ``candies += x;`` ` `            ``// Update the previous bought amount``            ``prevBought = x;``        ``}``    ``}`` ` `    ``return` `candies;``}`` ` `// Driver code``int` `main()``{``    ``int` `arr[] = { 1, 2, 1, 3, 6 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);``    ``cout << maxCandies(arr, n);`` ` `    ``return` `0;``}`

## Java

 `// Java implementation of the approach``class` `GFG``{``     ` `// Function to return the maximum candies``// that can be bought``static` `int` `maxCandies(``int` `arr[], ``int` `n)``{`` ` `    ``// Buy all the candies of the last type``    ``int` `prevBought = arr[n - ``1``];``    ``int` `candies = prevBought;`` ` `    ``// Starting from second last``    ``for` `(``int` `i = n - ``2``; i >= ``0``; i--) ``    ``{`` ` `        ``// Amount of candies of the current``        ``// type that can be bought``        ``int` `x = Math.min(prevBought - ``1``, arr[i]);`` ` `        ``if` `(x >= ``0``) ``        ``{`` ` `            ``// Add candies of current type``            ``// that can be bought``            ``candies += x;`` ` `            ``// Update the previous bought amount``            ``prevBought = x;``        ``}``    ``}`` ` `    ``return` `candies;``}`` ` `// Driver code``public` `static` `void` `main(String[] args)``{``    ``int` `arr[] = { ``1``, ``2``, ``1``, ``3``, ``6` `};``    ``int` `n = arr.length;``    ``System.out.println(maxCandies(arr, n));``}``}`` ` `// This code is contributed by Code_Mech.`

## Python3

 `# Python3 implementation of the approach `` ` `# Function to return the maximum candies ``# that can be bought ``def` `maxCandies(arr, n) :``     ` `    ``# Buy all the candies of the last type ``    ``prevBought ``=` `arr[n ``-` `1``];``    ``candies ``=` `prevBought; ``     ` `    ``# Starting from second last ``    ``for` `i ``in` `range``(n ``-` `2``, ``-``1``, ``-``1``) :``         ` `        ``# Amount of candies of the current``        ``# type that can be bought ``        ``x ``=` `min``(prevBought ``-` `1``, arr[i]); ``        ``if` `(x >``=` `0``) :``             ` `            ``# Add candies of current type ``            ``# that can be bought``            ``candies ``+``=` `x; ``             ` `            ``# Update the previous bought amount ``            ``prevBought ``=` `x; ``             ` `    ``return` `candies; `` ` `# Driver code ``if` `__name__ ``=``=` `"__main__"` `: ``     ` `    ``arr ``=` `[ ``1``, ``2``, ``1``, ``3``, ``6` `];``    ``n ``=` `len``(arr)``    ``print``(maxCandies(arr, n)); `` ` `# This code is contributed by Ryuga`

## C#

 `// C# implementation of the approach``using` `System;`` ` `class` `GFG``{``     ` `// Function to return the maximum candies``// that can be bought``static` `int` `maxCandies(``int``[] arr, ``int` `n)``{`` ` `    ``// Buy all the candies of the last type``    ``int` `prevBought = arr[n - 1];``    ``int` `candies = prevBought;`` ` `    ``// Starting from second last``    ``for` `(``int` `i = n - 2; i >= 0; i--) ``    ``{`` ` `        ``// Amount of candies of the current``        ``// type that can be bought``        ``int` `x = Math.Min(prevBought - 1, arr[i]);`` ` `        ``if` `(x >= 0) ``        ``{`` ` `            ``// Add candies of current type``            ``// that can be bought``            ``candies += x;`` ` `            ``// Update the previous bought amount``            ``prevBought = x;``        ``}``    ``}`` ` `    ``return` `candies;``}`` ` `// Driver code``public` `static` `void` `Main()``{``    ``int``[] arr= { 1, 2, 1, 3, 6 };``    ``int` `n = arr.Length;``    ``Console.WriteLine(maxCandies(arr, n));``}``}`` ` `// This code is contributed by Code_Mech.`

## PHP

 `= 0; ``\$i``--) ``    ``{`` ` `        ``// Amount of candies of the current``        ``// type that can be bought``        ``\$x` `= min(``\$prevBought` `- 1, ``\$arr``[``\$i``]);`` ` `        ``if` `(``\$x` `>= 0) ``        ``{`` ` `            ``// Add candies of current type``            ``// that can be bought``            ``\$candies` `+= ``\$x``;`` ` `            ``// Update the previous bought amount``            ``\$prevBought` `= ``\$x``;``        ``}``    ``}`` ` `    ``return` `\$candies``;``}`` ` `// Driver code``\$arr` `= ``array``(1, 2, 1, 3, 6 );``\$n` `= sizeof(``\$arr``);``echo``(maxCandies(``\$arr``, ``\$n``));`` ` `// This code is contributed by Code_Mech.``?>`
Output:
```10
```

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.  Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live and Geeks Classes Live USA

My Personal Notes arrow_drop_up