Помощь в разборе кода с++

Всем добрый вечер. У меня возникла большая проблема, в вузе 2 года назад сдавали с++ и был код, мы его ответили, но сейчас оказалось, что у меня опять долг. У меня есть программа которую мне нужно объяснить, чуть ли не построчно. Помогите пожалуйста разобраться в некоторых элементах кода. Можно просто текстом, можно и комментариями, как у меня про typedef pair. Просто понять, что делают эти слова в данный программе(ofstream fout, vector, auto, w_c, fin). Задача о рюкзаке это. Если у кого-то есть более понятный и простой код на эту задачу, так было бы легче думаю.

#include <iostream>
#include <limits>
#include <utility>
#include <vector>
#include<fstream>

using namespace std;
typedef pair < int, int > T_weight_and_cost; // объединение двух элементов, к первому first, ко второму second
typedef vector < T_weight_and_cost > T_weights_and_costs; 

ofstream fout;

void print_most_costly_contents_of_knapsack
(
int w_capacity,
T_weights_and_costs weights_and_costs
)
{
    setlocale(LC_ALL, "Russian");
    int total_cost_max{};

    T_weights_and_costs best_weights_and_costs;

    do
    {
        int total_weight{};
        int total_cost{};
        size_t i{};

        for (; i < weights_and_costs.size(); ++i)
        {
            auto & w_c = weights_and_costs[i];
            total_weight += w_c.first;
            total_cost += w_c.second;

            if (
                total_weight
        > w_capacity
        )
            {
                total_cost -= w_c.second;
                break;
            }
        }

        if (
            total_cost
> total_cost_max
)
        {
            total_cost_max = total_cost;

            best_weights_and_costs.assign
                (
                weights_and_costs.begin(),
                weights_and_costs.begin() + i
                );
        }
    } while (
        next_permutation
        (
        weights_and_costs.begin(),
        weights_and_costs.end()
        )
        );

    cout << endl;

    if (
        best_weights_and_costs.empty()
        )
    {
        std::cout << "Нет подходящих сочетаний"
            << std::endl;
    }
    else
    {
        for (auto best_w_c : best_weights_and_costs)
        {
            cout << best_w_c.first
                << '\t'
                << best_w_c.second
                << endl;
        }
    }

    cout << "end"
        << std::endl;
}

int main()
{
    ifstream fin("vvod.txt");
    int w_capacity{};
    fin >> w_capacity;


    int n{};
    fin >> n;

    T_weights_and_costs weights_and_costs(n);

    for (int i = 0; i < n; ++i)
    {

        fin >> weights_and_costs[i].first;


        fin >> weights_and_costs[i].second;
    }

    std::sort
        (
        weights_and_costs.begin(),
        weights_and_costs.end()
        );

    print_most_costly_contents_of_knapsack
        (
        w_capacity,
        weights_and_costs
        );
    system("pause");
} 

Ответы (0 шт):