假设我们有一个称为nums的数字列表,另一个值为k,我们必须检查是否有可能将nums划分为k个不同的子集,其中每个子集的总和都相同。
因此,如果输入像nums = [4,2,6,5,1,6,6,3] k = 3,则输出将为True,因为我们可以像[6,3],[6 ,2、1]和[4、5]。
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: bool check(vector<int>& v) { for (int i = 1; i < v.size(); i++) { if (v[i] != v[0]) return false; } return true; } bool dfs(int idx, vector<int>& nums, vector<int>& temp) { if (idx == nums.size()) { return check(temp); } bool ret = false; for (int i = 0; i < temp.size(); i++) { temp[i] += nums[idx]; ret = dfs(idx + 1, nums, temp); if (ret) return true; temp[i] -= nums[idx]; } return false; } bool solve(vector<int>& nums, int k) { vector<int> temp(k); return dfs(0, nums, temp); } }; bool solve(vector<int>& nums, int k) { return (new Solution())->solve(nums, k); } int main(){ vector<int> v = {4, 2, 6, 5, 1, 6, 3}; int k = 3; cout << solve(v, 3); }
{4, 2, 6, 5, 1, 6, 3}, 3输出结果
1