各个公司实习笔试题集锦

实习编程题,方法比较low,很naive,如有错误,请见谅,望及时指正。

Question #1

阿里

小明在双十一晚会上抽奖赢得了一次了一次天猫超市免单机会,享受在一个包裹内最大体积V,最大重量M内免单。假设商品i,体积Vi,重量Mi,库存Si,价格Pi。目前,天猫超市的商品分为生鲜水产(1)、食品酒类(2)、美妆个护(3)、居家生活(4)四大类,其中生鲜水产不与美妆个护同包裹。请你帮助小明在购物车里添置商品使得总价值最大。

输入:

商品总类n,包裹限定总体积v,包裹限定总重量m(接下来会有n行)

商品1体积,商品1重量,商品1库存,商品1价格,商品1类型

商品2体积,商品2重量,商品2库存,商品2价格,商品2类型

商品3体积,商品3重量,商品3库存,商品3价格,商品3类型

输出:

购物车里商品的总价值

输入范例:

3, 40, 30

10, 10, 10, 10, 1

13, 10, 12, 11, 3

3, 4, 6, 5, 3

输出: 

33

分析一波:加强版的0-1背包问题,多个库存可以当作有s件质量、体积、价格,但是不相同的商品。生鲜和美妆不能装在一起,可以把原问题拆解为(生鲜水产、食品酒类、居家生活)和(食品酒类、美妆个护、居家生活)两个子问题,再返回两个子问题的求解中较大的一个作为最终的求解。

# coding:utf-8
# 动态规划求解
def f(n, v, m, cv, cw, cp):
    res = [[[0 for _ in range(m+1)] for _ in range(v+1)] for _ in range(n+1)]
    for i in range(n+1):
        if i == 0:
            continue
        for j in range(v+1):
            if j == 0:
                continue
            for k in range(m+1):
                if k == 0:
                    continue
                if j < cv[i] & k < cw[i]:
                    res[i][j][k] = res[i-1][j][k]
                else:
                    res[i][j][k] = max(res[i-1][j][k], res[i-1][j-cv[i]][k-cw[i]] + cp[i])

    return res[n][v][m]


# cv为商品体积的列表,cw为商品重量的列表,cs为商品库存的列表,cp为商品价格的列表,ci为商品类型的列表,
def main(n, v, m, cv, cw, cs, cp, ci):
    k = 0
    # 若给出的商品含有生鲜和美妆类型商品发生冲突
    if 1 in ci and 3 in ci:
        # 将生鲜和化妆品分成两个子问题
        cv1 = [0]; cw1 = [0]; cp1 = [0]
        cv2 = [0]; cw2 = [0]; cp2 = [0]
        for i in range(len(ci)):
            if ci[i] != 1:
                for _ in range(cs[i]):
                    cv1.append(cv[i])
                    cw1.append(cw[i])
                    cp1.append(cp[i])
            if ci[i] != 3:
                for _ in range(cs[i]):
                    cv2.append(cv[i])
                    cw2.append(cw[i])
                    cp2.append(cp[i])
        k1 = f(n, v, m, cv1, cw1, cp1)
        k2 = f(n, v, m, cv2, cw2, cp2)
        k = max(k1, k2)
    else:
        cvt = [0]; cwt = [0]; cpt = [0]
        for i in range(len(ci)):
            for _ in range(cs[i]):
                cvt.append(cv[i])
                cwt.append(cw[i])
                cpt.append(cp[i])
        k = f(n, v, m, cvt, cwt, cpt)
    return k


if __name__ == "__main__":
    print(main(3, 40, 30, [10, 13, 3], [10, 10, 4], [10, 12, 6], [10, 11, 5], [1, 3, 3]))

Question #2

百度

一家公司想在某市开展运输服务,这个城市只有一个加油站,该公司已经确定了一些接载乘客的地点(x, y),公司希望用直线连接起来,以便所有路径都精确覆盖加油站一次。请你帮助公司确定路径的数量,使得路径最少,并且覆盖所有的接载点。
 

 

你可能感兴趣的:(刷题)