2020小红书,前两道很快做出来了,但是第三题考试的时候没做出来,当时满脑子都觉得跟01背包特别像,但是本来掌握的也不是很好,没能成功套上去。
这会写了一种解法,感觉已经不是动态规划了,而且for循环过多。希望抛砖引玉,学习更好的解法。
题目是一共N件衣服,每件有价格和价值两个属性,限定荷包(总价格不能超过B)和衣柜(总件数不能超过S),求价值最大的方案,如果价值最大有几个方案,取其中价格最低的,如果还相同,取衣服件数少的。
思路:本来是想前i件取j件,然后用一个tuple保存当前最大价值及对应的价格,但是考虑到取下一件的时候,对i-1,j-1的情况,可能最大价值下的价格加当前价格会超,但是取另外j-1件就不超,且价值会大于不取当前的策略,所以还是准备用三维数组,保存前i件取j件且价格为k时的价值。后续除了取第一件的时候会在原来价值0的基础上做,其他的需要k循环时检测,价值0的就不考虑了
import sys
N,B,S = list(map(int,input().split()))
P = [0]*N
V = [0]*N
for i in range(N):
inputline = list(map(int,input().split()))
P[i],V[i] = inputline
# 特例,只要找一件衣服
if S==1:
res = [0,0]
for i in range(N):
if P[i] < B and V