Untitled
#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; } };
Leave a Comment