Есть n троек чисел ti, ci, di (i-индекс). Из них нужно выбрать ровно m троек так, чтобы значение выражения |сумма выбранных t| + |сумма выбранных с| + |сумма выбранных d| была максимально возможной.
Входные данные. ( 1 ≤ n ≤ 1000 , 0 ≤ m ≤ n ) и (− 10^10 ≤ ti , di ,ci ≤ 10^10)
Пробовал тупо перебором, но на каком-то тесте программа выдает неправильный ответ
#include <iostream>
#include <vector>
#include <cmath>
#include <stdio.h>
using namespace std;
int main() {
int n, m; cin >> n >> m;
vector<long long> t,d,c;
long long max = 0;
long long sumT = 0, sumD = 0, sumC = 0, cur = 0;
for (int i = 0; i < n; ++i) cin >> t >> d >> c;
Ваш код решает задачу перебором всех возможных комбинаций троек чисел. Однако, такой подход может быть неэффективным, если n достаточно велико. Ваш код работает за время O(2^n * n), что может быть слишком медленным для больших значений n.
Однако, есть другой способ решения этой задачи, который работает быстрее. Вы можете использовать динамическое программирование для решения этой задачи. Сложность такого алгоритма будет O(n * m), что значительно быстрее, чем ваш текущий подход.
Вот пример кода, который решает эту задачу с помощью динамического программирования: #include
#include
#include
#include
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector t, d, c;
for (int i = 0; i < n; ++i) cin >> t >> d >> c;
vector dp(m + 1, vector(n + 1, -1e18));
dp[0][0] = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j