刷题求助|473.火柴拼正方形疑惑
878
2023.06.23
发布于 未知归属地

如题,我之前写了一个要分成k个子集的题目,思路是:dfs+状态压缩+记忆化搜索,于是我依葫芦画瓢,写了下面这段代码:

class Solution:
    def makesquare(self, matchsticks: List[int]) -> bool:
        all_sum = sum(matchsticks)
        if all_sum%4!=0:return False
        n = len(matchsticks)
        per = all_sum//4
        matchsticks.sort()
        if matchsticks[-1]>per:return False

        @cache
        def dfs(s,p,k):
            if s==(1<<n-1) and k==4:return True

            for i in range(n):
                if p+matchsticks[i]>per:break
                cursum = (p+matchsticks[i])%per
                if s&(1<<i)==0 and dfs(s^(1<<i),cursum,k+(1 if cursum==0 else 0)):return True #增加了最后这个k参数
            return False
        return dfs(0,0,0)

这段代码的主要内容和之前提到的那个题目差不多,但是我针对这个题目改了一下,增加了一个参数,用于记录一共分了多少组。我觉得我的思路没问题,但是运行起来就不对。我的想法是写一段能够判断“是否能够划分成k个相等和的子集并且记录k的值”,对于这个题目来说,判断k是否等于4。求各路大神棒棒忙看看哪里有问题?

评论 (7)