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]) 这行也能输出最大价值