1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| ''' Author: NEFU AB-IN Date: 2024-08-25 21:17:11 FilePath: \LeetCode\698\698.py LastEditTime: 2024-08-25 22:06:24 '''
import random from collections import Counter, defaultdict, deque from datetime import datetime, timedelta from functools import lru_cache, reduce from heapq import heapify, heappop, heappush, nlargest, nsmallest from itertools import combinations, compress, permutations, starmap, tee from math import ceil, comb, fabs, floor, gcd, hypot, log, perm, sqrt from string import ascii_lowercase, ascii_uppercase from sys import exit, setrecursionlimit, stdin from tokenize import group from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar, Union
TYPE = TypeVar('TYPE') N = int(2e5 + 10) M = int(20) INF = int(1e12) OFFSET = int(100) MOD = int(1e9 + 7)
setrecursionlimit(int(2e9))
class Arr: array = staticmethod(lambda x=0, size=N: [x() if callable(x) else x for _ in range(size)]) array2d = staticmethod(lambda x=0, rows=N, cols=M: [Arr.array(x, cols) for _ in range(rows)]) graph = staticmethod(lambda size=N: [[] for _ in range(size)])
class Math: max = staticmethod(lambda a, b: a if a > b else b) min = staticmethod(lambda a, b: a if a < b else b)
class Std: pass
class Solution: def canPartitionKSubsets(self, nums: List[int], k: int) -> bool: if sum(nums) % k != 0 or len(nums) < k: return False
group_sum = sum(nums) // k nums.sort(reverse=True) vis_ = Arr.array(0, len(nums)) flag = False
@cache def dfs(cur_sum: int, cur_num: int, used_cnt: int): nonlocal flag if flag: return
if cur_sum == group_sum: cur_num += 1 if cur_num == k: flag = True return if len(nums) - used_cnt >= k - cur_num: dfs(0, cur_num, used_cnt) return
for i, num in enumerate(nums): if not vis_[i] and cur_sum + num <= group_sum: vis_[i] = 1 used_cnt += 1 dfs(cur_sum + num, cur_num, used_cnt) vis_[i] = 0 used_cnt -= 1 return
dfs(0, 0, 0) return flag
|