使用Python實現貪心算法


題目:

    聖誕節來臨了,在城市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

實現的效果圖:

此處用兩組數據進行測試:

第一組數據:

    

第二組數據:

    

如果各位大佬有更好的方法,歡迎以下評論區說下,如果有什么不懂得,也同樣歡迎評論區發表疑問。謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM