当前位置:首页 > 编程笔记 > 正文
已解决

洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 python解析

来自网友在路上 167867提问 提问时间:2023-11-20 09:55:05阅读次数: 67

最佳答案 问答题库678位专家为你答疑解惑

P1064 [NOIP2006 提高组] 金明的预算方案

时间:2023.11.19
题目地址:[NOIP2006 提高组] 金明的预算方案

题目分析

动态规划的0-1背包,采用动态数组。如果不了解的话,可以先看看这个背包DP。
这个是0-1背包的标准状态转移方程 f [ j ] = m a x ( f [ j − w [ i ] ] + v [ i ] , f [ j ] ) f[j] = max(f[j-w[i]] + v[i], f[j]) f[j]=max(f[jw[i]]+v[i],f[j])。那么就基于对这个方程进行展开。
五种情况:
① 不放。
m a x ( ) max() max()
② 放主物品,不带副品。
f [ j ] = f [ j ] = m a x ( f [ j − m a i n _ a r t [ i ] [ 0 ] ] + m a i n _ a r t [ i ] [ 1 ] , f [ j ] ) f[j] = f[j] = max(f[j-main\_art[i][0]] + main\_art[i][1], f[j]) f[j]=f[j]=max(f[jmain_art[i][0]]+main_art[i][1],f[j])
③ 放主物品,带1副品。
f [ j ] = m a x ( f [ j ] , f [ j − m a i n _ a r t [ i ] [ 0 ] − r a l _ a r t [ i ] [ 1 ] [ 0 ] ] + m a i n _ a r t [ i ] [ 1 ] + r a l _ a r t [ i ] [ 1 ] [ 1 ] ) f[j] = max(f[j], f[j-main\_art[i][0]-ral\_art[i][1][0]] + main\_art[i][1] + ral\_art[i][1][1]) f[j]=max(f[j],f[jmain_art[i][0]ral_art[i][1][0]]+main_art[i][1]+ral_art[i][1][1])
④ 放主物品,带2副品。
f [ j ] = m a x ( f [ j ] , f [ j − m a i n _ a r t [ i ] [ 0 ] − r a l _ a r t [ i ] [ 2 ] [ 0 ] ] + m a i n _ a r t [ i ] [ 1 ] + r a l _ a r t [ i ] [ 2 ] [ 1 ] ) f[j] = max(f[j], f[j-main\_art[i][0]-ral\_art[i][2][0]] + main\_art[i][1] + ral\_art[i][2][1]) f[j]=max(f[j],f[jmain_art[i][0]ral_art[i][2][0]]+main_art[i][1]+ral_art[i][2][1])
⑤ 放主物品,带1、2副品。
f [ j ] = m a x ( f [ j ] , f [ j − m a i n _ a r t [ i ] [ 0 ] − r a l _ a r t [ i ] [ 1 ] [ 0 ] − r a l _ a r t [ i ] [ 2 ] [ 0 ] ] + m a i n _ a r t [ i ] [ 1 ] + r a l _ a r t [ i ] [ 1 ] [ 1 ] + r a l _ a r t [ i ] [ 2 ] [ 1 ] ) f[j] = max(f[j], f[j-main\_art[i][0]-ral\_art[i][1][0]-ral\_art[i][2][0]] + main\_art[i][1] + ral\_art[i][1][1] + ral\_art[i][2][1]) f[j]=max(f[j],f[jmain_art[i][0]ral_art[i][1][0]ral_art[i][2][0]]+main_art[i][1]+ral_art[i][1][1]+ral_art[i][2][1])
这些理解清楚了就简单了。
但是超时了三个,enmm…,有点那啥,主要是理解思路和过程,掌握方法好吧。
1

代码

n, m = map(int, input().split())
main_art = [[] for _ in range(m+1)]
ral_art = [[0, [0]*2, [0]*2] for _ in range(m+1)] 
# 例:[[0, [0, 0], [0, 0]], [1, [300, 600], [0,0]], [2, [200, 400], [100, 400]]]
for i in range(1, m+1):v, p, q = map(int, input().split())if q == 0:main_art[i] = [v, p*v]else:ral_art[q][0] += 1ral_art[q][ral_art[q][0]][0] = vral_art[q][ral_art[q][0]][1] = v*pf = [0]*(n+1)
for i in range(1, m+1):if not main_art[i]:continuefor j in range(n, main_art[i][0]-1, -1):f[j] = max(f[j-main_art[i][0]] + main_art[i][1], f[j])if j >= main_art[i][0] + ral_art[i][1][0]: # 判断剩余钱(空间)能否买(放)这个物品。f[j] = max(f[j], f[j-main_art[i][0]-ral_art[i][1][0]] + main_art[i][1] + ral_art[i][1][1])if j >= main_art[i][0] + ral_art[i][2][0]: # 判断剩余钱(空间)能否买(放)这个物品。f[j] = max(f[j], f[j-main_art[i][0]-ral_art[i][2][0]] + main_art[i][1] + ral_art[i][2][1])if j >= main_art[i][0] + ral_art[i][1][0] + ral_art[i][2][0]: # 判断剩余钱(空间)能否买(放)这个物品。f[j] = max(f[j], f[j-main_art[i][0]-ral_art[i][1][0]-ral_art[i][2][0]] + main_art[i][1] + ral_art[i][1][1] + ral_art[i][2][1])
print(f[n])
查看全文

99%的人还看了

相似问题

猜你感兴趣

版权申明

本文"洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 python解析":http://eshow365.cn/6-40232-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!