Distribute Money to Maximum Children

🏠 ⬅️ ➑️

You are given an integer money denoting the amount of money (in dollars) that you have and another integer children denoting the number of children that you must distribute the money to.

You have to distribute the money according to the following rules:

  • All money must be distributed.
  • Everyone must receive at least 1 dollar.
  • Nobody receives 4 dollars.

Return the maximum number of children who may receive exactly 8 dollars if you distribute the money according to the aforementioned rules. If there is no way to distribute the money, return -1.

Example 1:

Input: money = 20, children = 3 Output: 1 Explanation: The maximum number of children with 8 dollars will be 1. One of the ways to distribute the money is: - 8 dollars to the first child. - 9 dollars to the second child. - 3 dollars to the third child. It can be proven that no distribution exists such that number of children getting 8 dollars is greater than 1.

Example 2:

Input: money = 16, children = 2 Output: 2 Explanation: Each child can be given 8 dollars.

Constraints:

  • 1 <= money <= 200
  • 2 <= children <= 30

Note: This problem is from LeetCode.
❌ Compiled
❌ Executed
❌ Correct
program main
    implicit none

    integer :: money, children, result

    money = 20
    children = 3
    result = solve(money, children)
    write (*, '(A, I0)') 'Result: ', result

    money = 16
    children = 2
    result = solve(money, children)
    write (*, '(A, I0)') 'Result: ', result

contains

    function solve(money, children) result(result)
        implicit none
        integer, value :: money, children
        integer :: i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
        integer :: result

        ! This solution uses a brute force approach to find the maximum number of children
        ! who may receive exactly 8 dollars if we distribute the money according to the
        ! aforementioned rules.
        !
        ! We start by considering all possible combinations of children who may receive 8 dollars.
        ! For each combination, we check whether it satisfies the rules. If it does, we increment
        ! the result variable.
        !
        ! The time complexity of this solution is O(n^2), where n is the number of children.
        ! The space complexity is O(1).

        result = -1

        do i = 1, children
            do j = 1, children
                if (i + j == 8) then
                    if (i /= 1 .and. j /= 1) then
                        result = max(result, i + j)
                    end if
                end if
            end do
        end do

        do i = 1, children
            do j = 1, children
                do k = 1, children
                    if (i + j + k == 8) then
                        if (i /= 1 .and. j /= 1 .and. k /= 1) then
                            result = max(result, i + j + k)
                        end if
                    end if
                end do
            end do
        end do

        do i = 1, children
            do j = 1, children
                do k = 1, children
                    do l = 1, children
                        if (i + j + k + l == 8) then
                            if (i /= 1 .and. j /= 1 .and. k /= 1 .and. l /= 1) then
                                result = max(result, i + j + k + l)
                            end if
                        end if
                    end do
                end do
            end do
        end do

        do i = 1, children
            do j = 1, children
                do k = 1, children
                    do l = 1, children
                        do m = 1, children
                            if (i + j + k + l + m == 8) then
                                if (i /= 1 .and. j /= 1 .and. k /= 1 .and. l /= 1 .and. m /= 1) then
                                    result = max(result, i + j + k + l + m)
                                end if
                            end if
                        end do
                    end do
                end do
            end do
        end do

        do i = 1, children
            do j = 1, children
                do k = 1, children
                    do l = 1, children
                        do m = 1, children
                            do n = 1, children
                                if (i + j + k + l + m + n == 8) then
                                    if (i /= 1 .and. j /= 1 .and. k /= 1 .and. l /= 1 .and. m /= 1 .and. n /= 1) then
                                        result = max(result, i + j + k + l + m + n)
                                    end if
                                end if
                            end do
                        end do
                    end do
                end do
            end do
        end do

        do i = 1, children
            do j = 1, children
                do k = 1
βœ… Compiled
βœ… Executed
❌ Correct
!-------------------------------------------------------------------------------
! This is a Fortran implementation of the problem described in the problem statement.
! The program takes two command line arguments: money and children.
! The program solves the problem and prints the maximum number of children who
! can receive exactly 8 dollars.
!-------------------------------------------------------------------------------

program max_children_8
    implicit none
    integer :: money, children, max_children
    max_children = solve_problem(money, children)
    write (*,*) max_children
contains
    !---------------------------------------------------------------------------
    ! This function solves the problem by using dynamic programming.
    ! The function takes two arguments: money and children.
    ! The function returns the maximum number of children who can receive exactly
    ! 8 dollars.
    !---------------------------------------------------------------------------
    integer function solve_problem(money, children) result(max_children)
        implicit none
        integer, intent(in) :: money, children
        integer, dimension(money, children) :: dp
        integer :: i, j
        dp(1,:) = 1
        do i = 2, money
            do j = 1, children
                if (j == 1) then
                    dp(i,j) = 1
                else
                    dp(i,j) = max(dp(i-1,j-1), dp(i-4,j))
                end if
            end do
        end do
        max_children = dp(money, children)
    end function solve_problem
end program max_children_8
🌐 Data from online sources
def maximum_children_with_eight_dollars(money, children):
    if money < children * 1 or money > children * 8:
        return -1
    max_eights = (money - children) // 7
    return children if max_eights >= children else max_eights

In this problem, we calculate the maximum number of children who get exactly 8 dollars by making sure that we follow the given rules. We first check if it's possible to distribute money with these constraints. If the amount of money is less than the product of the number of children and 1 or greater than the product of the number of children and 8, return -1 as it's not possible.

Then, find the maximum number of eights by subtracting the number of children from the amount of money and dividing the result by 7. We divide the result by 7, as we're trying to maximize the children getting exactly 8 dollars, and the other amounts could range from 1 to 3 or 5 to 7.

Finally, if the maximum number of eights is greater than or equal to the number of children, return the number of children. Otherwise, return the maximum number of eights. This calculation ensures that we're getting the maximum number of children who get exactly 8 dollars.

🌐 Data from online sources
int maximumChildrenWithEightDollars(int money, int children) {
    if (money < children * 1 || money > children * 8) return -1;
    int max_eights = (money - children) / 7;
    return max_eights >= children ? children : max_eights;
}

In this problem, we calculate the maximum number of children who get exactly 8 dollars by making sure that we follow the given rules. We first check if it's possible to distribute money with these constraints. If the amount of money is less than the product of the number of children and 1 or greater than the product of the number of children and 8, return -1 as it's not possible.

Then, find the maximum number of eights by subtracting the number of children from the amount of money and dividing the result by 7. We divide the result by 7, as we're trying to maximize the children getting exactly 8 dollars, and the other amounts could range from 1 to 3 or 5 to 7.

Finally, if the maximum number of eights is greater than or equal to the number of children, return the number of children. Otherwise, return the maximum number of eights. This calculation ensures that we're getting the maximum number of children who get exactly 8 dollars.