【笔试代码题记录】190604 vivo

1. 反转部分链表

题目要求:(leetcode92题,vivo笔试题)

Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL

思路比较简单,首先把链表依次压入栈中,然后使用reversed函数反转栈的相应位置,最后遍历链表,依次弹出栈中元素,修改链表值。
https://blog.csdn.net/weixin_42304045/article/details/80619938

2. 背包问题

背包问题的解法 https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html(讲解很清晰)
https://blog.csdn.net/qq_34178562/article/details/79959380

礼品采购问题,
【输入描述:】
第一行是一个正整数,表示礼品的总金额(不大于1000)
第二行是一个长度为n的正整数数组,表示礼品单价(n不大于100)
第三行是一个长度为n的正整数数组,表示对应礼品的热度值

【输出描述:】
可以获得的最高总热度值

【样例输入:】
1000
200 600 100 180 300 450
6 10 3 4 5 8
【样例输出:】
21

背包问题都是一个套路,c是书包 能承受的重量,n是物品的重量,w是每个物品的重量,v是每个物品的价值。
在本题中,c = 1000, n =6, w = [200, 600, 100, 180, 300, 450] , v = [6, 10, 3, 4, 5, 8]
思路:动态规划,对每一件物品遍历背包容量,当背包可容纳值大于等于当前物品,与之前已放进去的物品所得价值进行对比,考虑是否需要置换。尾部迭代,每个状态表示上一次的最佳结果。
value[i][j]表示 在面对第 i 件物品,且背包容量为 j 时所能获得的最大价值,value[i][j]的计算方法如下:

  • 当j < w[i] 时,说明背包塞不下第i件物品了,只能选择不拿 value[ i ][ j ] = value[ i-1 ][ j ]
  • 当j >=w[i]时,背包可以塞下第i件物品,这时需要判断 value[ i ][ j ]和value[ i-1 ][ j-w[ i] ] + v[ i ]的大小(这里的value[ i-1 ][ j-w[ i] ]就是考虑了第i-1件物品,背包容量为j-w[i]时的最大价值,也是相当于为第i件物品腾出了w[i]的空间。),并将value[i][j]设为二者中的最大值。
def bag(c, w, v, n):
    value = [[0 for i in range(c + 1)] for j in range(n + 1)]
    for i in range(1, n + 1): # 物品数
        for j in range(1, c + 1): # 金额
            value[i][j] = value[i - 1][j] # 一定不能漏掉这句,将上一行的值复制下来
            if j >= w[i-1] and value[i][j] < value[i-1][j - w[i-1]] + v[i-1]:
                value[i][j] = value[i-1][j - w[i-1]] + v[i-1]
    return value

def show(n, c, w, value):
    print('最大价值为:', value[n][c])
    x = [False for i in range(n)]
    j = c
    for i in range(n, 0, -1):
        if value[i][j] > value[i - 1][j]:
            x[i - 1] = True
            j -= w[i - 1]
    print('背包中所装物品为:')
    for i in range(n):
        if x[i]:
            print('第', i+1, '个,', end='')

c = 1000 # 总金额
w = [200, 600, 100, 180, 300, 450] # 每个物品的金额
v = [6, 10, 3, 4, 5, 8] # 每个物体的热度
n = 6 # 物品的总数量

res = bag(c, w, v, n)
show(n,c,w,res) # 调用show函数显示更清楚的信息
# print(res[n][c]) 这行也能输出最大价值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值