題目:
聖誕節來臨了,在城市A中,聖誕老人准備分發糖果。現在有多箱不同的糖果,每一種糖果都有自己的價值和重量。每箱糖果都可以拆分成任意散裝組合帶走。聖誕老人的馴鹿最多只能承受一定重量的糖果。請問聖誕老人最多能帶走多大價值的糖果。
輸入數據:
輸入的第一行由兩個部分組成,分別為糖果箱數正整數n(1<=n<=100),馴鹿能承受的最大重量正整數w(0<w<10000);其余n行每行對應一箱糖果,由兩部分正整數v和w組成,分別為一箱糖果的價值和重量。
輸出要求:
輸出聖誕老人能帶走的糖果的最大總價值,保留一位小數,輸出為一行。
輸出樣例:
4 15
100 4
412 8
266 7
591 2
輸出樣例:
1193.0
注:此處並沒有按照這樣的格式進行輸入。
1 #coding:utf-8 2 from __future__ import division 3 4 input_a = raw_input(u'箱數:') 5 input_b = raw_input(u'最大承受重量:') 6 7 list_c = [] 8 list_z = [] 9 10 for i in range(1,int(input_a)+1): 11 input_c = raw_input('第'+str(i)+'箱的總價值:') 12 input_d = raw_input('第'+str(i)+'箱的重量:') 13 avg = round(int(input_c)/int(input_d),1)#每一箱,重量為1的價值 14 list_c.append(avg)#添加到列表,用於之后做比較 15 list_z.append([int(input_d),avg,0])#此處列表中添加列表,中間的列表一個存放總重量,第二個存放單位價值,第三個存放是否該物品已被取走 16 17 list_c.sort(reverse=True) # 降序排序 18 sum =[0,0]# 用於存放取走的總重量,第一個參數是取走的重量,第二個是超出前的備份 19 num =0 20 ji = 0 21 22 23 for i in range(len(list_c)): 24 for k in range(len(list_z)): 25 if ji == 0:#做是否超出馬車最大承受量的標記,未超出為0 26 if (list_c[i] == list_z[k][1]) and (list_z[k][2]==0): 27 sum[1] = sum[0]#備份 28 sum[0] = sum[0] + list_z[k][0]#取走的重量 29 v = list_z[k][0]#取走的重量 30 if sum[0] > int(input_b):#如果所有取走的重量超出馬車的重量,就依次減少一單元的重量 31 ji = 1#超出為1 32 t= list_z[k][0] 33 while True:#依次減去單位1的重量 34 z = sum[1] + t#使用備份進行判斷,此時取走的數量已經大於最大承受量了 35 if z <= int(input_b): 36 break 37 t = t-1 38 v=t#等於最大承受量時,價值較大的一件物品應取走的數量 39 sum[0]=sum[1]#從備份恢復 40 sum[0] = sum[0] + t#此時為真正的取走數量 41 num = list_c[i]*v + num#總價值 42 list_z[k][2] = 1#取走的標記 43 print u'能帶走的糖果的最大價值為:',num
實現的效果圖:
此處用兩組數據進行測試:
第一組數據:
第二組數據:
如果各位大佬有更好的方法,歡迎以下評論區說下,如果有什么不懂得,也同樣歡迎評論區發表疑問。謝謝!