
let constraints = new Array(n).fill(null).map(() => new Array(k + p + 1));

let objectiveFunctionCoefficients = new Array(k + p + 1);
for (let i = 0; i < k; i++) {
    console.log("Введите отрицательные коэффициенты");
    objectiveFunctionCoefficients[i] = parseInt(prompt());
}
for (let i = k; i < objectiveFunctionCoefficients.length; i++) {
    objectiveFunctionCoefficients[i] = 0;
}

let m = constraints.length; // Количество ограничений
let n = constraints[0].length - 1; // Количество переменных

let table = new Array(m + 1).fill(null).map(() => new Array(n + 1)); // Создаем таблицу для симплекс метода

// Заполняем таблицу с учетом ограничений и целевой функции
for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
        table[i][j] = constraints[i][j];
    }
    table[i][n] = constraints[i][n]; // Значения правой части ограничений
}

for (let j = 0; j < n; j++) {
    table[m][j] = objectiveFunctionCoefficients[j]; // Коэффициенты целевой функции
}

while (true) {
    // Находим входящий разрешающий столбец
    let pivotColumn = -1;
    for (let j = 0; j < n; j++) {
        let min = table[m][0];
        if (table[m][j] < 0) {
            if (min > table[m][j]) {
                min = table[m][j];
                pivotColumn = j;
            } else {
                pivotColumn = j;
            }
        }
    }
    if (pivotColumn == -1) { // Если все коэффициенты целевой функции неотрицательны, завершаем метод
        break;
    }
    // Находим исходящую строку по минимальному отношению
    let pivotRow = -1;
    let minRatio = Number.MAX_VALUE;
    for (let i = 0; i < m; i++) {
        if (table[i][pivotColumn] > 0) {
            let ratio = table[i][n] / table[i][pivotColumn];
            if (ratio < minRatio) {
                minRatio = ratio;
                pivotRow = i;
            }
        }
    }

    if (pivotRow == -1) { // Если отношение не существует, задача неограничена
        throw new Error("Решение неограничено");
    }

    let pivotElement = table[pivotRow][pivotColumn];
    for (let j = 0; j < n + 1; j++) {
        table[pivotRow][j] /= pivotElement; // Делим строку на опорный элемент
    }

    // Обновляем таблицу
    for (let i = 0; i < m + 1; i++) {
        if (i !== pivotRow) {
            let multiplier = table[i][pivotColumn];
            for (let j = 0; j < n + 1; j++) {
                table[i][j] -= multiplier * table[pivotRow][j]; // Вычитаем из всех строк кроме опорной
            }
        }
    }
}

console.log("Решение симплекс-методом:");
console.log("Значение целевой функции: " + table[m][n]);
for (let i = 0; i < table.length; i++) {
    for (let j = 0; j < table[0].length; j++) {
        console.log(table[i][j] + " ");
    }
    console.log();
}