题目描述

  1. 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
  2. 示例 1
  3. 输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
  4. 输出: True
  5. 说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
  6. 示例 2:
  7. 输入: nums = [1,2,3,4], k = 3
  8. 输出: false
  9. 提示:
  10. 1 <= k <= len(nums) <= 16
  11. 0 < nums[i] < 10000
  12. 每个元素的频率在 [1,4] 范围内

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/partition-to-k-equal-sum-subsets 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题思路

这种求解问题,首先看了一下感觉不能用动态规划来做,因为不具有共同子问题和最优子结构
那还是老老实实先从排列组合的思路来看,计算机比人强就强在,他善于辛辛苦苦的按照规则进行计算
首先啊,我们可以观察发现,nums数组总和应该是可以知道的,先遍历一遍求和即可,然后我们可以发现,k知道之后,就可以知道我们要去凑的那个子集的和为多少了。
698. 划分为k个相等的子集TodoDP状态压缩 - 图1

代码实现

  1. class CQueue {
  2. stack<int> A,B;
  3. public:
  4. CQueue() {
  5. //stack<int> A,B;
  6. }
  7. void appendTail(int value) {
  8. A.push(value);
  9. }
  10. int deleteHead() {
  11. int temp_result;
  12. if(B.empty()){
  13. if(A.empty())
  14. return -1;
  15. else{
  16. while(A.empty()==0){
  17. B.push(A.top());
  18. A.pop();
  19. }
  20. temp_result = B.top();
  21. B.pop();
  22. return temp_result;
  23. }
  24. }
  25. else{
  26. temp_result = B.top();
  27. B.pop();
  28. return temp_result;
  29. }
  30. }
  31. };
  32. /**
  33. * Your CQueue object will be instantiated and called as such:
  34. * CQueue* obj = new CQueue();
  35. * obj->appendTail(value);
  36. * int param_2 = obj->deleteHead();
  37. */

[

](https://www.zhihu.com/question/38842804/answer/78413820)