我有以下對象:尋找複雜項目的最佳組合?
enum Slot
{
HANDS, LEGS, CHEST, HEAD, FEET;
}
class Clothing
{
// The slot this piece of clothing is worn on.
Slot s;
// The color of the clothing, used for `gradeOutfit`
Color c;
}
class Person
{
Map<Slot, Clothing> body;
// look through his outfit and give a score
// for how well he looks
int gradeOutfit()
{
return ...
}
}
我有一個Person
對象和Clothing
的集合。這個集合有許多Clothing
對象的每個Slot
。例如,它可能是這樣的:
MyCloset = { GREEN_HAT, RED_VEST, BLACK_VEST,
BLUE_JEANS, BROWN_PANTS, RED_SHOES, BLACK_HAT, BLUE_GLOVES, PURPLE_VEST }
在我的節目的現實,還有很多更多的項目不僅僅是這些,但是這僅僅是一個簡單的例子。
問題:
我需要找到這些衣服,導致最高gradeOutfit
得分的組合。這意味着我的Person
將必須確保他每Clothing
物品與其他Clothing
物品(在限制範圍內,例如不可能戴兩個帽子,因爲它們都是HEAD
Slot
)都會嘗試。一個Person
不能有gradeOutfit
呼叫,直到他們每Slot
穿戴Clothing
項目。
我在想遞歸是做這件事的最好方法,但是如果我有足夠數量的項目,我想我會很快得到堆棧溢出。我試着迭代地做,但我似乎無法找到一個很好的簡單方法來循環一切。我的程序基本上看起來像
Person p = new Person();
for (Clothing i : MyCloset)
{
for (Clothing h : MyCloset)
{
if (i == h) continue;
if (!p.isWearing(h.slot())
{
p.wear(h);
}
}
int score = p.gradeOutfit();
}
但我知道這只是一個可怕的方法。爲了確保每件衣服都與其他服飾產品搭配,我需要更多的循環邏輯。無論我嘗試什麼,它都會變成意大利麪代碼。我還需要避免兩次穿着同一套服裝,並確保沒有任何服裝組合被遺忘。
什麼是最好的辦法來處理這樣的事情?
顏色或服裝的分數是否獨立? –
@AakashVerma不,「gradeOutfit」分數是一個複雜的算法,完全取決於裝備。例如,有兩件'RED'項目的服裝得分較高,但如果RED項目靠近海誓山盟,則得分較低。假設不同的服裝可能導致完全不同的分數。 – Hatefiend
我很抱歉,我不完全瞭解這個問題,但我認爲對於插槽枚舉中的每個項目,您都有一個集合。然後,你想從每個藏品中拿出一件物品,並將其稱爲西裝。然後,這個人穿上那件衣服,然後你評價它。如果是這種情況,你需要列出所有的組合並遍歷它。列出所有組合都很容易。看到這個鏈接http://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n/。你將不得不使用一些調整,而不是輸入數組中的每個元素,引用集合項 –