小米笔试: 数组中多个数求和结果等于目标值则返回1,否则返回0 (题目太长不写了)

样例输入:一个数组 [99,199,1999,10000,39,1499]
目标值 10238
结果应该输出1
第一种方法:排列组合。时间复杂度异常大,先上。下面第二种方法来优化。

def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = list(range(r))
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)
def  miHomeGiftBag(p, M):
    Sum = 0
    list1 = []
    sub = []
    for i in range(2,len(p)+1):
        for x in combinations(p,i):
            if sum(x) == M:
                return 1
    return 0
p = [99,199,1999,10000,39,1499]
print(miHomeGiftBag(p,10238))

结果如下:

1

第二种方法:动态规划。(因为笔试不能用numpy,而我觉得numpy比较方便,所以这里是用了numpy,如果不希望用numpy,我在java的动态规划文章中有论述这题如何做。)

import numpy as np

def dp_subset(arr,target):
    subset = np.zeros((len(arr),target+1),dtype=bool)
    subset[0,:] = False
    subset[:,0] = True
    subset[0,arr[0]] = True
    for i in range(1,len(arr)):
        for j in range(1,target+1):
            if arr[i] > j:
                subset[i,j] = subset[i-1,j]
            else:
                A = subset[i-1,j]
                B = subset[i-1,j-arr[i]]
                subset[i,j] = A or B
    r,l = subset.shape
    print(subset[0][90:150])
    return subset[r-1,l-1]
arr1 = [99,199,1999,10000,39,1499]   

结果如下:

True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值