Greedy algorithms to find minimum number of coins (CS50)
This code needs compiling with more warnings enabled:
gcc -std=c17 -fPIC -g -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds  -Wstrict-prototypes    -Wconversion    254841.c    -o 254841
254841.c: In function ‘main’:
254841.c:14:13: warning: conversion from ‘int’ to ‘float’ may change value [-Wconversion]
     money = dollars_to_cents(ask_money());
             ^~~~~~~~~~~~~~~~
254841.c:17:40: warning: conversion from ‘float’ to ‘int’ may change value [-Wfloat-conversion]
     printf(&quot;%i\n&quot;, min_coins_exchanged(money, coin_types, arr_length));
                                        ^~~~~
254841.c: In function ‘get_max_coins’:
254841.c:24:21: warning: conversion from ‘double’ to ‘int’ may change value [-Wfloat-conversion]
     int max_coins = floor((float)((_cents) / coin_type));
                     ^~~~~
254841.c:25:11: warning: conversion from ‘int’ to ‘float’ may change value [-Wconversion]
     money -= max_coins * coin_type;
           ^~
254841.c: In function ‘ask_money’:
254841.c:36:12: warning: conversion from ‘float’ to ‘int’ may change value [-Wfloat-conversion]
     return money;
            ^~~~~
254841.c: In function ‘dollars_to_cents’:
254841.c:42:12: warning: conversion from ‘double’ to ‘int’ may change value [-Wfloat-conversion]
     return round(money * 100);
            ^~~~~~~~~~~~~~~~~~
254841.c:40:26: warning: unused parameter ‘dollars’ [-Wunused-parameter]
 int dollars_to_cents(int dollars)
                      ~~~~^~~~~~~
254841.c: In function ‘min_coins_exchanged’:
254841.c:51:18: warning: conversion from ‘float’ to ‘int’ may change value [-Wfloat-conversion]
         _money = money;
                  ^~~~~

You have avoided some of the common traps, such as embedding the set of coins into the logic, although I wouldn't give those locale-specific names - here in Britain, we have 1, 2, 5, 10, 20, 50, 100 and 200 but they don't have nicknames.
I would instead make the set of coins be a global constant, without naming them individually:
const unsigned int coin_values = {
    25,  /* quarter */
    10,  /* dime    */
    5,   /* nickel  */
    1    /* penny   */
};
const size_t coin_values_len = sizeof coin_values / sizeof *coin_values;

Avoid using floating-point types for money.  The problem is that .01 is not an exact fraction in binary, so the code is prone to error due to rounding.
Instead, do something like
unsigned int dollars, cents = 0;
if (scanf(&quot;%u.%u&quot;) &lt; 1) {
    fputs(&quot;Currency parse failure\n&quot;, stderr);
    return EXIT_FAILURE;
}
/* if we got here, we read the dollars, and perhaps the cents */
unsigned int total_cents = 100 * dollars + cents;  /* TODO: deal with overflow */

You're using some names that you shouldn't:

int get_max_coins(int _cents, int coin_type)


All identifiers beginning with _ followed by a letter are reserved for use by the implementation.  That means it's a bad idea to use these names in your own code.  There's no reason not to just call the argument cents without that prefix, so that's what I'd recommend.
There's some pointless conversion here:

int max_coins = floor((float)((_cents) / coin_type));


cents / coin_type is of type int.  We convert that to float (losing precision), truncate the fractional part (which will be zero, since we started with an integer) and then implicitly convert to int.  That code is a very inefficient and problematic way to write

int max_coins = _cents / coin_type;


There's some serious problems with global variables, and there seems to be confusion passing values by parameter or via globals.  Look at this:
float money;

int main(void)
{
    money = dollars_to_cents(ask_money());
}

int dollars_to_cents(int dollars)
{
    return round(money * 100);
}

int ask_money(void)
{
    do
    {
        money = get_float(&quot;Change owed: &quot;);
    }
    while (money &lt; 0);
    return money;
}

In main(), we assign to money, which we're also using in ask_money.  And dollars_to_cents() completely ignores its argument and shares the global variable.  There's no need for this variable to be shared - each function can have its own local variable:
int main(void)
{
    int money = dollars_to_cents(ask_money());
}

int dollars_to_cents(float dollars)
{
    /* don't actually use float - see earlier in review */
    return round(dollars * 100);
}

float ask_money(void)
{
    float money;
    do
    {
        money = get_float(&quot;Change owed: &quot;);
    }
    while (money &lt; 0);
    return money;
}


Summary

Eliminate the global variables
Use more appropriate numeric types