程序检查我们是否可以在C ++中用相等和的k个分区对列表进行分区

假设我们有一个称为nums的数字列表,另一个值为k,我们必须检查是否有可能将nums划分为k个不同的子集,其中每个子集的总和都相同。

因此,如果输入像nums = [4,2,6,5,1,6,6,3] k = 3,则输出将为True,因为我们可以像[6,3],[6 ,2、1]和[4、5]。

范例(C ++)

让我们看下面的实现以更好地理解-

#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

猜你喜欢