Untitled
unknown
c_cpp
10 months ago
1.9 kB
8
Indexable
#include <vector>
#include <functional>
using namespace std;
class Solution {
public:
int minTransfers(vector<vector<int>>& debts) {
int n = 0;
for (auto& d : debts) {
int from = d[0], to = d[1];
n = max(n, max(from, to) + 1);
}
vector<long long> balance(n, 0);
for (auto& d : debts) {
int from = d[0], to = d[1];
long long amount = d[2];
balance[from] += amount;
balance[to] -= amount;
}
vector<long long> nums;
for (long long x : balance) {
if (x != 0) {
nums.push_back(x);
}
}
if (nums.empty()) {
return 0;
}
int m = nums.size();
vector<long long> sum_mask(1 << m, 0);
for (int mask = 0; mask < (1 << m); ++mask) {
for (int i = 0; i < m; ++i) {
if (mask & (1 << i)) {
sum_mask[mask] += nums[i];
}
}
}
vector<int> dp(1 << m, -1);
dp.back() = 0; // When all elements are used, base case
function<int(int)> solve = [&](int mask) {
if (dp[mask] != -1) {
return dp[mask];
}
int available = ((1 << m) - 1) ^ mask;
int max_val = 0;
for (int subset = available; subset != 0; subset = (subset - 1) & available) {
if (sum_mask[subset] == 0) {
int new_mask = mask | subset;
int current = 1 + solve(new_mask);
if (current > max_val) {
max_val = current;
}
}
}
return dp[mask] = max_val;
};
int max_subsets = solve(0);
return m - max_subsets;
}
};Editor is loading...
Leave a Comment