题解 | #分割等和子集#

分割等和子集

http://www.nowcoder.com/practice/65ade309fa4d4067a9add749721bfdc0

python解法,十个案例能跑通九个。最后一个案列超时,没有优化思路,征集一下

nums=list(map(int,input().split()))
sums=sum(nums)
if sums%2==1:
    print('false')
else:
    N=sums//2
    dp=[float('-inf') for i in range(N+1)]
    dp[0]=0
    for i in range(n):
        if nums[i]>N:
            print('false')
            break
        else:
            for j in range(N,nums[i]-1,-1):
                dp[j]=max(dp[j],dp[j-nums[i]]+nums[i])
                if dp[-1]!=float('-inf'):
                        break
                        break
    if dp[-1]!=float('-inf'):
        print('true')
    else:
        print('false')
全部评论
其实没必要去求什么最大最小值,我们只关心能不能刚好凑够j, 所以初始化dp = [False] * (N+1) 状态转移时直接 dp[j] = dp[j] | dp[j-nums[i]] 即可。到这里优化不太大。 观察我们的 dp[j] = dp[j] | dp[j-nums[i]],其实我们只关心 dp中为False的数据就可以了,不必枚举每个j。 所以可以用 dict记录 为False的j,若dp[j-nums[i]]为true,pop出字典就行了。
1 回复 分享
发布于 2023-07-20 21:15 山东
最后一个案例刻意给的大数字,如果不用搜索代替对i循环的话,只能写个短路面向测试编程了。 估计用搜索可以加快100倍,我没有写,你可以试试看。
点赞 回复 分享
发布于 2022-04-18 12:53

相关推荐

wu970:标准北漂配置,怎么看着装修风格有点像自如的😭
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务