2014-09-27 62 views
0

所以基本上我有一个非常典型的问题,我在之前发现了一些来自stackoverflow的解决方案,但这并没有真正帮助我。在Python中转义两个列表

我有一个学校的任务,需要我分析雪橇队。我在三个单独的名单中列出了名字,他们的评级和体重,我需要挑选四名最佳等级的选手,他们的体重总和不得超过325公斤。我已经完成的是我创建了一个for周期,该周期挑选出四个最高评级的竞争对手,但问题是他们可能有很高的评级,但他们的体重总和超过325公斤。 比如我有三个列表:

["Name1","Name2","Name3","Name4","Name5","Name6","Name7","Name8"] ## names 
[1,2,3,4,5,6,7,8] ##ratings 
[50,60,70,80,90,100,110,120] ##weights 

什么,我得到的是[5,6,7,8](和他们每个人都有一个根据权重表和名单,例如用于评价5进入的竞争者,重量90公斤和名称是名字5)但他们的体重总和高于325kg(90 + 100 + 110 + 120> 325)

我已经完成了编码,至少将最小元素(5)移除并替换为另一个下元素,但是当切换最后一个元素还不够时,问题就会出现(问题是我不知道该怎么做),我需要尝试替换元素6并将元素5保留在原位。

眼下用于切换的代码是:

while (kaalude_summa > 325): #if weight is over 325 kg 
    positsioon = reiting.index(max(reiting)) #position for max rating 
    if kaalud[positsioon] < kaalude_tulemused[3]: #two lists - one is for elements not in the resulting list (kaalud) and one is for the elements in resulting list (kaalude_tulemused) 
     kaalude_tulemused[3] = kaalud[positsioon] #sets new weight in result list 
     tulemuslist.remove(min(tulemuslist)) #removes number 5 from example list [5,6,7,8] (check above) 
     tulemuslist.append(max(reiting)) #adds number 4 from example list 
     kaalude_summa = kaalude_summa - vahekaal + kaalude_tulemused[3] #new calculated weight 
    reiting.remove(max(reiting)) #removes element from list [1,2,3,4] 
    kaalud.remove(kaalud[positsioon]) 

这只要工作与等级1,2,3或4重量+其他三个权重(6,7,8)的竞争对手不大于325.

我明白这可以用两个for循环以某种方式完成,但我尝试了三次,失败惨败。

爱沙尼亚语在我们学校写代码是强制性的,所以我很抱歉不用英文写作。

我真的很希望我写的内容可读,而且能够帮助我。先谢谢你。

+0

http://pastebin.com/1JPKqUbh将整个代码添加到pastebin中,如果我对发生的事情的解释不够清楚。 – charen 2014-09-27 16:09:27

回答

1

蛮力的方法是找到4个雪橇的所有可能的组合。对于每一个人,找到他们的组合权重,并丢弃那些超过其他人的325.,选择最高评级。

+0

这是一个选项,但不幸的是,我们不允许使用这种蛮力,代码必须在正常的时间框架内工作,所以我猜想两个循环更好。 – charen 2014-09-27 16:17:48

+0

我不知道如何解释我们用英语学习的东西,但它是这样的:http://stackoverflow.com/questions/16555978/example-of-a-factorial-time-algorithm-on 它必须是指数(cn) – charen 2014-09-27 16:18:55

0

解决此问题的一个选择是在放置更多while-s后。虽然IT仍然是易碎的,但它会检查每个位置的元素。

while (kaalude_summa > 325): #AGA KUI JUHTUB SEE NALI, ET MAX REITINGUD LIIDETAKSE JA IKKA ON PAKSUD 
    if reiting == []: 
     break 
    positsioon = reiting.index(max(reiting)) #max reitingu positsioon 
    if kaalud[positsioon] < kaalude_tulemused[3]: 
     kaalude_tulemused[3] = kaalud[positsioon] 
     tulemuslist.remove(min(tulemuslist)) 
     tulemuslist.append(max(reiting)) 
     kaalude_summa = kaalude_summa - vahekaal + kaalude_tulemused[3] 
    reiting.remove(max(reiting)) 
    kaalud.remove(kaalud[positsioon]) 

if kaalude_summa > 325: 
    reiting = reiting_safecopy[0:len(reiting_safecopy)] 
    tulemuslist = tulemuslist_safecopy[0:len(tulemuslist_safecopy)] 
    kaalud = kaalud_safecopy[0:len(kaalud_safecopy)] 

while (kaalude_summa > 325): #KUI ESIMENE WHILE EI AIDANUD 
    if reiting == []: 
     break 
    positsioon = reiting.index(max(reiting)) #max reitingu positsioon 
    if kaalud[positsioon] < kaalude_tulemused[2]: 
     kaalude_tulemused[2] = kaalud[positsioon] 
     tulemuslist.remove(min(tulemuslist)) 
     tulemuslist.append(max(reiting)) 
     kaalude_summa = kaalude_summa - vahekaal + kaalude_tulemused[3] 
    reiting.remove(max(reiting)) 
    kaalud.remove(kaalud[positsioon]) 

if kaalude_summa > 325: 
    reiting = reiting_safecopy[0:len(reiting_safecopy)] 
    tulemuslist = tulemuslist_safecopy[0:len(tulemuslist_safecopy)] 
    kaalud = kaalud_safecopy[0:len(kaalud_safecopy)] 

while (kaalude_summa > 325): #KUI TEINE WHILE KA EI AIDANUD 
    if reiting == []: 
     break 
    positsioon = reiting.index(max(reiting)) #max reitingu positsioon 
    if kaalud[positsioon] < kaalude_tulemused[1]: 
     kaalude_tulemused[1] = kaalud[positsioon] 
     tulemuslist.remove(min(tulemuslist)) 
     tulemuslist.append(max(reiting)) 
     kaalude_summa = kaalude_summa - vahekaal + kaalude_tulemused[3] 

    reiting.remove(max(reiting)) 
    kaalud.remove(kaalud[positsioon]) 

if kaalude_summa > 325: 
    reiting = reiting_safecopy[0:len(reiting_safecopy)] 
    tulemuslist = tulemuslist_safecopy[0:len(tulemuslist_safecopy)] 
    kaalud = kaalud_safecopy[0:len(kaalud_safecopy)] 

while (kaalude_summa > 325): #SIIS VAHETAME VIIMAST ELEMENTI!! 
    if reiting == []: 
     break 
    positsioon = reiting.index(max(reiting)) #max reitingu positsioon 
    if kaalud[positsioon] < kaalude_tulemused[0]: 
     kaalude_tulemused[0] = kaalud[positsioon] 
     tulemuslist.remove(min(tulemuslist)) 
     tulemuslist.append(max(reiting)) 
     kaalude_summa = kaalude_summa - vahekaal + kaalude_tulemused[3] 

    reiting.remove(max(reiting)) 
    kaalud.remove(kaalud[positsioon])