Design and Analysis of Algorithms - 10

Implement Program for “Making Change” using Dynamic Programming.

 

Code:


#include<stdlib.h>

 

struct change_entry

{

    unsigned int count;

    int coin;

    struct change_entry *prev;

};

typedef struct change_entry change_entry;

 

unsigned int make_change(const unsigned int *coins, size_t len, unsigned int value,

        unsigned int **solution)

{

    unsigned int i, j;

    change_entry **table;

    unsigned int result;

   

    table = malloc((len + 1) * sizeof(change_entry *));

    for (i = 0; i <= len; i++)

    {

        table[i] = malloc((value + 1) * sizeof(change_entry));

    }

 

    for (i = 0; i <= len; i++)

    {

        for (j = 0; j <= value; j++)

        {

            if (i == 0)

            {

               

                table[i][j].count = j;

                table[i][j].coin = -1;

                table[i][j].prev = NULL;

            }

            else if (j == 0)

            {

                table[i][j].count = 0;

                table[i][j].coin = -1;

                table[i][j].prev = NULL;

            }

            else if (coins[i - 1] == j)

            {

                table[i][j].count = 1;

                table[i][j].coin = i - 1;

                table[i][j].prev = NULL;

            }

            else if (coins[i - 1] > j)

            {

                table[i][j].count = table[i - 1][j].count;

                table[i][j].coin = -1;

                table[i][j].prev = &table[i - 1][j];

            }

            else

            {

                if (table[i - 1][j].count < table[i][j - coins[i - 1]].count + 1)

                {

                    table[i][j].count = table[i - 1][j].count;

                    table[i][j].coin = -1;

                    table[i][j].prev = &table[i - 1][j];

                }

                else

                {

                    table[i][j].count = table[i][j - coins[i - 1]].count + 1;

                    table[i][j].coin = i - 1;

                    table[i][j].prev = &table[i][j - coins[i - 1]];

                }

            }

        }

    }

    result = table[len][value].count;

    *solution = calloc(len, sizeof(unsigned int));

    if (*solution)

    {

        change_entry *head;

        for (head = &table[len][value];

                head != NULL;

                head = head->prev)

                {

            if (head->coin != -1)

            {

                (*solution)[head->coin]++;

            }

        }

    }

    else

    {

        result = 0;

    }

    

    for (i = 0; i <= len; i++)

    {

        free(table[i]);

    }

    free(table);

 

    return result;

}

 

int main(void)

{

    unsigned int coins[] = {1, 2, 5, 10, 20, 50, 100};

    const size_t len = sizeof(coins) / sizeof(coins[0]);

    const unsigned int value = 480;

    unsigned int *solution;

    unsigned int result = make_change(coins, len, value, &solution);

    unsigned int i;

    printf("Number of coins: %u\n", result);

    printf("Coins used:\n");

    for (i = 0; i < len; i++)

    {

        if (solution[i] > 0)

        {

            printf("%u x %u\n", solution[i], coins[i]);

        }

    }

    free(solution);

    return 0;

}


Output:


 

 

 




Conclusion:

In this Practical, I understand to Implement program for “Making Change” using Dynamic Programming.

Comments

Popular posts from this blog

Computer Architecture and Organization - 4

Design and Analysis of Algorithms - 2

Design and Analysis of Algorithms - 6

Design and Analysis of Algorithms - 1

Artificial Intelligence - 7