1. 程式人生 > >藍橋杯題目_金陵十三釵

藍橋杯題目_金陵十三釵

問題描述  在電影《金陵十三釵》中有十二個秦淮河的女人要自我犧牲代替十二個女學生去赴日本人的死亡宴會。為了不讓日本人發現,自然需要一番喬裝打扮。但由於天生材質的原因,每個人和每個人之間的相似度是不同的。由於我們這是程式設計題,因此情況就變成了金陵n釵。給出n個女人和n個學生的相似度矩陣,求她們之間的匹配所能獲得的最大相似度。
  所謂相似度矩陣是一個n*n的二維陣列like[i][j]。其中i,j分別為女人的編號和學生的編號,皆從0到n-1編號。like[i][j]是一個0到100的整數值,表示第i個女人和第j個學生的相似度,值越大相似度越大,比如0表示完全不相似,100表示百分之百一樣。每個女人都需要找一個自己代替的女學生。
  最終要使兩邊一一配對,形成一個匹配。請程式設計找到一種匹配方案,使各對女人和女學生之間的相似度之和最大。輸入格式  第一行一個正整數n表示有n個秦淮河女人和n個女學生
  接下來n行給出相似度,每行n個0到100的整數,依次對應二維矩陣的n行n列。輸出格式  僅一行,一個整數,表示可獲得的最大相似度。樣例輸入4
97 91 68 14
8 33 27 92
36 32 98 53
73 7 17 82樣例輸出

         354

Python原始碼:

like = [[97,91,68,14],[8,33,27,92],[36,32,98,53],[73,7,17,82]]
def perm(begin):
    global mate, maximum
    if begin >= len(mate):
        print(mate)
        s = 0
        for i, j in enumerate(mate):
            s += like[i][j]
        maximum = s if s > maximum else maximum
    else:
        for i in range(begin, len(mate)):
            mate[begin],mate[i]=mate[i],mate[begin]
            perm(begin+1)
            mate[begin],mate[i]=mate[i],mate[begin]
mate = [i for i in range(4)]
maximum = 0
perm(0)
print(maximum)