2013-08-06 85 views
0

目前,我正在開發一個程序來爲我的田徑比賽生成最佳設置。我有Person類的一些對象(當然是定製的),它們都有一個名字(-String)。 現在,我想生成所有可能的設置列表。把它看作是一羣必須完成許多任務的人。示例(兩個人,兩個任務):自定義數組的Java排列

Person1 doing both tasks, Person1 doing first task and Person2 doing second, Person2 doing first task and Person1 doing second, Person2 doing both tasks

現在,我想這與數目不詳的「任務」和人員,所以預編程的循環不會看起來像一個解決方案給我。在我看來,遞歸是要走的路,但我還沒有弄明白。 考慮設置爲人員數組,我知道第一個指示的含義是什麼,所以只需打印人員姓名即可。 (如:Person1, Person2什麼的。)

謝謝!

+0

你是什麼意思的「預編程循環」? – Michelle

+0

像,我不能創建循環來減少所有的可能性,因爲我不知道會有多少。 – Kevin0306

+0

您可以在for循環中使用數學表達式和函數調用,例如'for(int i = 0; i Michelle

回答

1

您可能想研究樹數據結構。如果你製作一個樹列表,並且認爲每個樹根都是一個人,那麼每個後續節點都是一個任務......所以這樣你可以遍歷所有樹和節點,找到所有可能的組合。

+0

去年我在大學編程課上有過這樣的事情。要試一試。謝謝! – Kevin0306

1

理論上,你想要的不是排列,而是combinations with repetitions。 我發現現有的實現爲Java:http://code.google.com/p/combinatoricslib/

EDIT(關於評論):

的問題甚至比重複的組合更爲複雜。這裏描述爲Partition of a set

+0

從技術上講,訂單很重要,因此對於三個任務'Person1,Person2,Person1'與'Person1,Person1,Person2'是不同的解決方案。難道這不會讓它變成排列嗎?但是,實現似乎很有用,所以謝謝! – Kevin0306

+0

訂單的重要性不會讓任何東西變成一個排列組合:)然而,你是對的,那些重複的組合是不夠的。我已經更新了答案,希望它有幫助。 – BartoszKP

0

遞歸會完成這項工作,但要意識到它會非常快地變成計算上不可行的,所以我會建議一種不同的方法,具體取決於您的目標是什麼。事實上,如此快速變得不可行,以至於如果團隊中的人數超過4人或5人以上,並且超過幾項任務,代碼將無法完成。

*大約