字节机考-4-10-第四题

# coding=utf-8
import sys
 
def f2(a, types):
    n = len(a)
    max_card = -1
    for i in range(len(a)): # 这里可以优化
        node = [int(e) for e in str(a[i])]
        max_card = max(max_card, max(node))
        node = set(node)
        t = 0
        for e in node:
            e = int(e)
            t += ((2**(e)))
        a[i] = t
    b = [bin(i)[2:] for i in a] 
    if max_card < types:
        return -1
    max_len = [len(b_node) for b_node in b] 
    size = 2 ** max(max_len) 
 
    dp = [[float('inf') for i in range(size)]  for _ in range(n)]
    item0 = a[0]
    for j in range(size):
        dp[0][j] = 1 if j == item0 else float('inf')
    for i in range(n):
            dp[i][0] = 0
 
    for i in range(1,n):
        item = a[i]
        for j in range(size):
            new_j = j | item
 
            dp[i][new_j] = min(dp[i][new_j], dp[i-1][j]+1, dp[i][new_j])
            dp[i][j] = min(dp[i-1][j], dp[i][j])
 
    return dp[-1][-2]
 
t = input()
for i in range(t):
    mnk = sys.stdin.readline().split()
    n,m,k = int(mnk[0]), int(mnk[1]), int(mnk[2])
    items = []
    for nn in range(n):
        cards = sys.stdin.readline().split()
        items.append(int("".join(cards)))
    print(f2(items, m))
典型的0-1背包问题,dp[i][j]: 前i个商品,能收集到j张卡牌的最小商品数量, 注意这里的j必须能记录特定的卡牌是否已经放进背包,一共也就10张卡牌,所以可以用二进制的每一位表示一张卡牌,比如商品内有卡牌'420', 那么他的体积就是1011,其中1的位置就代表了对应的卡
## 注意这里我是针对字节的题目的分析,字节机考略有不同

全部评论

相关推荐

03-11 23:33
已编辑
曲阜师范大学 后端工程师
牛客68808588...:果真开发过12306购票系统吗,这不是一眼就被看穿了
点赞 评论 收藏
分享
smile丶snow:感觉可以加一些ai相关的内容吧。现在面试很少能逃掉这些问题。羡慕里面感觉缺少一个项目背景。比如第二个项目后台管理系统…你为什么要做这个后台管理系统呢?是为了解决什么问题。比如你管理一个商品列表的增加减少。需要一个背景吧。哦或者说你第一个电子书那个是c端的,你肯定需要一个管理系统吧,那就是第二个后台管理系统,但这两个难道不应该是一个项目吗?可以稍微包装一下,最起码让人看着不是玩具项目。个人观点。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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