期末考试小明取得了优异的成绩,妈妈为鼓励小明再接再厉,在网购平台指定了N(2≤N≤50)件礼物供小明挑选。挑选前妈妈提出了以下要求:
1)每种礼物只能挑选1件;
2)所挑选的礼物总价格不能大于V(1≤V≤100)。
已知N件礼物中每件礼物的价格和小明对每件礼物的喜爱值(喜爱值越大喜爱程度越高),请你帮助小明挑选礼物,使得挑选的所有礼物在满足要求的前提下,总的喜爱值最大,并输出最大喜爱值。
例如:
N = 3,V=5,3件礼物的价格和喜爱值分别为(1,2),(2,4),(3,3)。
可挑选第二件礼物(2,4)和第三件礼物(3,3),总价格为5(5=2+3),总喜爱值为7(7=4+3),总价格不大于5且喜爱值最大,输出7。
第二行开始,输入N行,每行输入两个正整数J(1≤J≤V)和K(1≤K≤100),分别表示每件礼物的价格和喜爱值,正整数之间以一个英文逗号隔开
输出描述
输出一个整数,表示在满足题目要求下的最大喜爱值
样例输入
3,5
1,2
2,4
3,3
样例输出
7
该回答引用ChatGPT
该代码使用了动态规划的思想,具体来说,定义状态 $dp_i$ 表示总价格不超过 $i$ 时可以获得的最大喜爱值,状态转移方程为:
$dp_j = max(dp_j, dp_{j-w_i} + v_i)$
其中,$w_i$ 和 $v_i$ 分别表示第 $i$ 件物品的价格和喜爱值。
def findMaxLove(n, v, items):
dp = [0 for i in range(v + 1)]
for i in range(n):
for j in range(v, items[i][0] - 1, -1):
dp[j] = max(dp[j], dp[j - items[i][0]] + items[i][1])
return dp[v]
n = 3
v = 5
items = [(1, 2), (2, 4), (3, 3)]
print(findMaxLove(n, v, items))
大哥这是蓝桥杯原题,你是不是作弊了
这道题目涉及到了背包问题,具体来说是0/1背包问题,因为每件物品只能选择一次。
解决这道题目的方法是使用动态规划,具体过程如下:
定义状态:设dp[i][j]表示前i件礼物中挑选价格不大于j时的最大喜爱值
状态转移方程:如果第i件礼物的价格小于等于j,那么dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]),否则dp[i][j]=dp[i-1][j];其中v[i]表礼物i的价格,w[i]表礼物i的喜爱值。
初始状态:dp[0][j]=0,表礼物数量为0时,最大喜爱值为0。
结果:最终答案即为dp[n][v]。
代码如下(python):
def getMaxValue(n,v,values,weights):
dp=[[0]*(v+1) for i in range(n+1)]
for i in range(1,n+1):
for j in range(1,v+1):
if j<values[i-1]:
dp[i][j]=dp[i-1][j]
else:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-values[i-1]]+weights[i-1])
return dp[n][v]
if __name__=="__main__":
n,v=map(int,input().split(','))
values=[]
weights=[]
for i in range(n):
value,weight=map(int,input().split(','))
values.append(value)
weights.append(weight)
print(getMaxValue(n,v,values,weights))
不知道你这个问题是否已经解决, 如果还没有解决的话: