你有一个背包,最多能容纳的体积是V。
现在有n种物品,每种物品有任意多个,第i种物品的体积为
,价值为
。
(1)求这个背包至多能装多大价值的物品?
(2)若背包恰好装满,求至多能装多大价值的物品?
第一行两个整数n和V,表示物品个数和背包体积。接下来n行,每行两个数和
,表示第i种物品的体积和价值。
输出有两行,第一行输出第一问的答案,第二行输出第二问的答案,如果无解请输出0。
2 6 5 10 3 1
10 2
3 8 3 10 9 1 10 1
20 0
无法恰好装满背包。
6 13 13 189 17 360 19 870 14 184 6 298 16 242
596 189
可以装5号物品2个,达到最大价值298*2=596,若要求恰好装满,只能装1个1号物品,价值为189.
import sys
def solution(n,V,v,m):
dp1 = [0 for _ in range(V+1)]
dp2 = [float("-inf") for _ in range(V+1)]
dp2[0] = 0
for i in range(V+1):
for j in range(n):
if i<v[j]:break
#if dp2[i-v[j]] != float('-inf'):# 可以省略
dp1[i] = max(dp1[i],dp1[i-v[j]]+w[j])
dp2[i] = max(dp2[i],dp2[i-v[j]]+w[j])
#print(dp1)
#print(dp2)
if dp2[-1] == float("-inf"):
dp2[-1] = 0
return dp1[-1],dp2[-1]
if __name__ == "__main__":
n,V = map(int, input().split())
v = [0 for _ in range(n)]
w = [0 for _ in range(n)]
p = [0 for _ in range(n)]
for i in range(n):
p[i] = list(map(int,input().split()))
p = sorted(p, key=lambda x:(x[0],x[1]))
v,w =zip(*p)
#print(v,w)
res1,res2 = solution(n,V,v,w)
print(res1)
print(res2) import sys
# 空间复杂度使用二维数组
def ks(n, V, P, M):
dp = [[float("-inf") for _ in range(V+1)] for _ in range(n+1)]
for x in range(len(dp)):
dp[x][0] = 0
# for y in range(len(dp[0])):
# dp[0][y] = 0
for i in range(1, n+1):
for j in range(1, V+1):
if j >= P[i]:
for k in range(0, j//P[i]+1):
dp[i][j] = max(dp[i][j], dp[i-1][j-k*P[i]]+k*M[i])
else:
dp[i][j] = dp[i-1][j]
print(max(max(dp)))
if dp[-1][-1] == float("-inf"):
print(0)
else:
print(dp[-1][-1])
# 通过19/20,算法超时
def ks_B(n, V, P, M):
dp = [float("-inf") for _ in range(V+1)]
dp[0] = 0
for i in range(1, n+1):
for j in range(V, -1, -1):
for k in range(0, j//P[i]+1):
dp[j] = max(dp[j], dp[j-k*P[i]]+k*M[i])
print(max(dp))
if dp[-1] != float("-inf"):
print(dp[-1])
else:
print(0)
return
# 满足要求
# 思考:容量序列遍历为何可以使用正向序列?而且序列的起点可以为P[i]?
# 完全背包问题,物品i没有数量限制;
# 当 j < P[i]时,容量不足以容纳物品 i,
# 相当于d[i][j] = d[i-1][j], 在O(n)复杂度的算法中也就是不更新内容,所以可以设置起点为P[i]
def ks_C(n, V, P, M):
dp = [float("-inf") for _ in range(V+1)]
dp[0] = 0
for i in range(1, n+1):
for j in range(P[i], V+1):
dp[j] = max(dp[j], dp[j-P[i]]+M[i])
print(max(dp))
if dp[-1] != float("-inf"):
print(dp[-1])
else:
print(0)
return
line1 = [int(x) for x in sys.stdin.readline().split()]
n = line1[0]
V = line1[1]
P = [0]
M = [0]
for line in sys.stdin:
tmp = [int(x) for x in line.split()]
P.append(tmp[0])
M.append(tmp[1])
ks_C(n, V, P, M)
def ans():
n, size = map(int,input().split(" "))
v, w = [] , []
for _ in range(n):
t1, t2 = map(int,input().split(" "))
v.append(t1)
w.append(t2)
dp1 = [0] * (size+1)
dp2 = [float("-inf")] * (size+1)
dp2[0] = 0
for i in range(n):
for j in range(1,size+1):
if j >= v[i]:
dp1[j] = max(dp1[j], dp1[j-v[i]] + w[i])
dp2[j] = max(dp2[j], dp2[j-v[i]] + w[i])
print(dp1[-1])
print(dp2[-1] if dp2[-1] != float("-inf") else 0)
ans()