from collections import defaultdict
defcanPartitionKSubsets(self, nums: List[int], k:int)->bool:
ssum =sum(nums)if ssum%k !=0:returnFalse
a = ssum//k ##每组的和
self.ans =False
nums =sorted(nums,reverse =True)
self.nums = defaultdict(int)for d in nums:
self.nums[d]+=1####存储所有值
self.used = defaultdict(int)####存储用过的值,把用过的去掉。defrec(nums,c,a,s):####c是第几组,a是每一组的和,s当前组的目前值。if s>a:##若当前值大于a,则返回returnif c == k and s == a:####若c==k,且s=a,即最后一组也能凑到a,就直接返回真
self.ans =Truereturnif self.ans:####若果结果已经是真了,也就不用再递归乱跑了,直接出去吧。returnif s == a:#####如果当前组的当前值等于a,那么就到下一组。
c +=1
nums =[]for h in self.nums:####这里是用self.nums来存储所有值,self.used来存储已经用过的,把用过了去掉。
nums +=[h]*(self.nums[h]-self.used[h])print(self.used)
rec(nums,c,a,0)
c-=1###恢复现场for i inrange(len(nums)):####求子集和为target
s += nums[i]
self.used[nums[i]]+=1
rec(nums[i+1:],c,a,s)
s -= nums[i]####恢复现场
self.used[nums[i]]-=1###恢复现场
rec(nums,1,a,0)return self.ans