1.在遙遠的國家佛羅布尼亞,嫌犯是否有罪,須由陪審團決定。陪審團是由法官從公眾中挑選的。先隨機挑選n 個人作為陪審團的候選人,然後再從這n 個人中選m 人組成陪審團。選m 人的辦法是:控方和辯方會根據對候選人的喜歡程度,給所有候選人打分,分值從0 到20。為了公平起見,法官選出陪審團的原則是:選出的m 個人,必須滿足辯方總分和控方總分的差的絕對值最小。如果有多種選擇方案的辯方總分和控方總分的之差的絕對值相同,那麼選辯控雙方總分之和最大的方案即可。最終選出的方案稱為陪審團方案。
輸入資料
輸入包含多組資料。每組資料的第一行是兩個整數n 和m,n 是候選人數目,m 是陪審團人數。注意,1<=n<=200, 1<=m<=20 而且 m<=n。接下來的n 行,每行表示乙個候選人
的資訊,它包含2 個整數,先後是控方和辯方對該候選人的打分。候選人按出現的先後從1開始編號。兩組有效資料之間以空行分隔。最後一組資料n=m=0
輸出要求
對每組資料,先輸出一行,表示答案所屬的組號, 如 'jury #1', 'jury #2', 等。接下來的一行要象例子那樣輸出陪審團的控方總分和辯方總分。再下來一行要以公升序輸出陪審團裡每
個成員的編號,兩個成員編號之間用空格分隔。每組輸出資料須以乙個空行結束。
輸入樣例
4 21 2
2 34 1
6 20 0
這道題目有一定難度。碰到求最優解的問題,都可以考慮一下能否用動態規劃解決。為敘述問題方便,現將任一選擇方案中,辯方總分和控方總分之差簡稱為「辯控差」,辯方總分和控方總分之和稱為「辯控和」。第i 個候選人的辯方總分和控方總分之差記為v(i),辯方總分和控方總分之和記為s(i)。現用f(j, k)表示,取j 個候選人,使其辯控差為k 的所有方案中,辯控和最大的那個方案(該方案稱為「方案f(j, k)」)的辯控和。並且,我們還規定,如果沒法選j 個人,使其辯控差為k,那麼f(j, k)的值就為-1,也稱方案f(j, k)不可行。
本題是要求選出m 個人,那麼,如果對k 的所有可能的取值,求出了所有的f(m, k) (-20×m≤ k ≤ 20×m),那麼陪審團方案自然就很容易找到了。
問題的關鍵是建立遞推關係。需要從哪些已知條件出發,才能求出f(j, k)呢?顯然,方案f(j, k)是由某個可行的方案f(j-1, x)( -20×m ≤ x ≤ 20×m)演化而來的。可行方案f(j-1, x)
能演化成方案f(j, k)的必要條件是:存在某個候選人i,i 在方案f(j-1, x)中沒有被選上,且x+v(i) = k。在所有滿足該必要條件的f(j-1, x)中,選出 f(j-1, x) + s(i) 的值最大的那個,那
麼方案f(j-1, x)再加上候選人i,就演變成了方案 f(j, k)。這中間需要將乙個方案都選了哪些人都記錄下來。不妨將方案f(j, k)中最後選的那個候選人的編號,記在二維陣列的元素
path[j][k]中。那麼方案f(j, k)的倒數第二個人選的編號,就是path[j-1][k-v[path[j][k]]。假定最後算出了解方案的辯控差是k,那麼從path[m][k]出發,就能順藤摸瓜一步步求出所有被選中的候選人。
初始條件,只能確定f(0, 0) = 0。由此出發,一步步自底向上遞推,就能求出所有的可行方案f(m, k)( -20×m ≤ k ≤ 20×m)。
實際解題的時候,會用乙個二維陣列f 來存放f(j, k)的值。而且,由於題目中辯控差的值k 可以為負數,而程式中數租下標不能為負數,所以,在程式中不妨將辯控差的值都加上400,以免下標為負數導致出錯,即題目描述中,如果辯控差為0,則在程式中辯控差為400。
組合語言 練習題4 2
內容 從鍵盤輸入一串字母並儲存在 string 開始的位址單元,要求將該字串中的大寫字母轉化為小寫字母後用子程式實現在終端上依次顯示該串字母的 ascii碼。string db n dup 要求 熟練掌握子程式設計方法,畫子程式 主程式流程圖 函式說明 readstring edx 存放字串首位址 ...
C 之練習題5
5.有乙個由按鈕組成的矩陣,其中每 行有6個按鈕,共5行。每個按鈕的位置上有一盞燈。當按下乙個按鈕後,該按鈕以及周圍位 置 上邊 下邊 左邊 右邊 的燈都會改變一次。即,如果燈原來是點亮的,就會被熄滅 如果燈原來是熄滅的,則會被點亮。在矩陣角上的按鈕改變3盞燈的狀態 在矩陣邊上的按鈕改變4盞燈的狀態...
C 之練習題32
1.數根可以通過把乙個數的各個位上的數字加起來得到。如果得到的數是一位數,那麼這個數就是數根。如果結果是兩位數或者包括更多位的數字,那麼再把這些數字加起來。如此進行下去,直到得到是一位數為止。比如,對於24 來說,把2 和4 相加得到6,由於6 是一位數,因此6 是24 的數根。再比如39,把3 和...