實習程式設計題,方法比較low,很*****,如有錯誤,請見諒,望及時指正。
阿里
小明在雙十一晚會上**贏得了一次了一次天貓超市免單機會,享受在乙個包裹內最大體積v,最大重量m內免單。假設商品i,體積vi,重量mi,庫存si,**pi。目前,天貓超市的商品分為生鮮水產(1)、食品酒類(2)、美妝個護(3)、居家生活(4)四大類,其中生鮮水產不與美妝個護同包裹。請你幫助小明在購物車裡添置商品使得總價值最大。
輸入:
商品總類n,包裹限定總體積v,包裹限定總重量m(接下來會有n行)輸出:商品1體積,商品1重量,商品1庫存,商品1**,商品1型別
商品2體積,商品2重量,商品2庫存,商品2**,商品2型別
商品3體積,商品3重量,商品3庫存,商品3**,商品3型別
購物車裡商品的總價值輸入範例:
3, 40, 30輸出: 分析一波:加強版的0-1揹包問題,多個庫存可以當作有s件質量、體積、**,但是不相同的商品。生鮮和美妝不能裝在一起,可以把原問題拆解為(生鮮水產、食品酒類、居家生活)和(食品酒類、美妝個護、居家生活)兩個子問題,再返回兩個子問題的求解中較大的乙個作為最終的求解。10, 10, 10, 10, 1
13, 10, 12, 11, 3
3, 4, 6, 5, 3
# coding:utf-8
# 動態規劃求解
def f(n, v, m, cv, cw, cp):
res = [[[0 for _ in range(m+1)] for _ in range(v+1)] for _ in range(n+1)]
for i in range(n+1):
if i == 0:
continue
for j in range(v+1):
if j == 0:
continue
for k in range(m+1):
if k == 0:
continue
if j < cv[i] & k < cw[i]:
res[i][j][k] = res[i-1][j][k]
else:
res[i][j][k] = max(res[i-1][j][k], res[i-1][j-cv[i]][k-cw[i]] + cp[i])
return res[n][v][m]
# cv為商品體積的列表,cw為商品重量的列表,cs為商品庫存的列表,cp為商品**的列表,ci為商品型別的列表,
def main(n, v, m, cv, cw, cs, cp, ci):
k = 0
# 若給出的商品含有生鮮和美妝型別商品發生衝突
if 1 in ci and 3 in ci:
# 將生鮮和化妝品分成兩個子問題
cv1 = [0]; cw1 = [0]; cp1 = [0]
cv2 = [0]; cw2 = [0]; cp2 = [0]
for i in range(len(ci)):
if ci[i] != 1:
for _ in range(cs[i]):
if ci[i] != 3:
for _ in range(cs[i]):
k1 = f(n, v, m, cv1, cw1, cp1)
k2 = f(n, v, m, cv2, cw2, cp2)
k = max(k1, k2)
else:
cvt = [0]; cwt = [0]; cpt = [0]
for i in range(len(ci)):
for _ in range(cs[i]):
k = f(n, v, m, cvt, cwt, cpt)
return k
if __name__ == "__main__":
print(main(3, 40, 30, [10, 13, 3], [10, 10, 4], [10, 12, 6], [10, 11, 5], [1, 3, 3]))
一家公司想在某市開展運輸服務,這個城市只有乙個加油站,該公司已經確定了一些接載乘客的地點(x, y),公司希望用直線連線起來,以便所有路徑都精確覆蓋加油站一次。請你幫助公司確定路徑的數量,使得路徑最少,並且覆蓋所有的接載點。
筆試題集錦
第一部分 必做 計算機基礎類 所有的選擇題都是多項選擇 1 假設進棧次序是e1,e2,e3,e4,那可能的出棧次序是 a e2,e4,e3,e1 b e2,e3,e4,e1 c e3,e2,e4,e1 d e1,e2,e4,e3 2 表示式x a b c d e的字尾表示形式可以是 a xab cd...
C C 筆試題集錦
1.求下面函式的返回值 微軟 int func x int countx 0 while x countx x x x 1 return countx 假定x 9999。答案 8 思路 將x轉化為2進製,看含有的1的個數。2.什麼是 引用 申明和使用 引用 要注意哪些問題?答 引用就是某個目標變數的...
微軟筆試題集錦
1.下面哪一項是二進位制數01011001乘以0111001後再加上1101110的結果 a 0001010000111111 b 0101011101110011 c 0011010000110101 解析 不需要硬算,前面乘出來最後三位是001,這樣加起來最後三位就是111 2.a,b,c,d都...