比方說,我有一個整數列表/陣列,即:列表項計算
{1, 2, 3, 4}
是否有一種方式來獲得增加的每一個可能的組合,並將它們添加到另一個列表/陣列?
像這樣:
1+2, 1+3, 1+4,
2+3, 2+4,
3+4,
1+2+3, 1+2+4, 1+3+4,
2+3+4,
1+2+3+4
所以,最終的結果將是(不重複):
{3, 4, 5, 6, 7, 8, 9, 10}
比方說,我有一個整數列表/陣列,即:列表項計算
{1, 2, 3, 4}
是否有一種方式來獲得增加的每一個可能的組合,並將它們添加到另一個列表/陣列?
像這樣:
1+2, 1+3, 1+4,
2+3, 2+4,
3+4,
1+2+3, 1+2+4, 1+3+4,
2+3+4,
1+2+3+4
所以,最終的結果將是(不重複):
{3, 4, 5, 6, 7, 8, 9, 10}
在此基礎上great answer這裏是一個版本,讓你消除「小子集「(*)
public static List<List<T>> GetCombination<T>(List<T> inputList, int minimumItems = 1)
{
int count = (int)Math.Pow(2, inputList.Count) - 1;
List<List<T>> result = new List<List<T>>(count + 1);
if (minimumItems == 0)
result.Add(new List<T>());
for (int i = 1; i <= count; i++)
{
List<T> combinason = new List<T>(inputList.Count);
for (int j = 0; j < inputList.Count; j++)
{
if ((i >> j & 1) == 1)
combinason.Add(inputList[j]);
}
if (combinason.Count >= minimumItems)
result.Add(combinason);
}
return result;
}
結果:
>> { {1,2}, {1,3}, {2,3}, {1,2,3}, {1,4}, {2,4},
>> {1,2,4}, {3,4}, {1,3,4}, {2,3,4}, {1,2,3,4} }
從該子集在這裏簡單.Sum()
:
Subsets.ForEach(s => result.Add(s.Sum()));
當你想清除列表中的每個副本:
DoublonList.Distinct();
PS:(*)找不到單詞英文單詞羣只有一個元素
有了更具體的詮釋列表,你可以做到這一點
static List<int> GetCombination(List<int> list, List<int> combinations, int sumNum, bool addNumberToResult = false)
{
if (list.Count == 0) {
return combinations;
}
int tmp;
for (int i = 0; i <= list.Count - 1; i++) {
tmp = sumNum + list[i];
if(addNumberToResult){
combinations.Add(tmp);
}
List<int> tmp_list = new List<int>(list);
tmp_list.RemoveAt(i);
GetCombination(tmp_list,combinations,tmp, true);
}
return combinations;
}
,並把它簡單地做
List<int> numbers = new List<int>(){1,2,3,4,5};
List<int> possibleCombination = GetCombination(numbers, new List<int>(), 0);
,並刪除重複的
possibleCombination.Distinct()
如果你想它訂貨人可以致電
possibleCombination.Distinct().OrderBy(itm => itm)
或
possibleCombination.Distinct().OrderByDescending(itm => itm)
編輯:正如皮埃爾正確地指出,該代碼沒有堅持的問題,因此我修正,添加或不號碼結果列表中添加的參數。
測試值'{1,2,3,4}'沒有給出預期的結果,發送'新列表
我用'{1,2,3,4}'再次運行它,輸出爲'1,2,3,4,5,6,7,8,9,10',但是出了什麼問題?我知道在構造函數中發送新的List似乎有些奇怪,這裏只是使用該函數的更快方式,您可以在調用GetCombination並將其作爲參數傳遞之前初始化列表,但對於重複性調用,您需要將它作爲參數。當然可以做任何改進。 – Leze
來自op問題:「所以最終結果將是(沒有重複): '{3,4,5,6,7,8,9,10}'」Op正在插入「singleton」子集'{{ 1},{2},{3},{4}}'。 –
是的,有..所以你有什麼嘗試? – BugFinder
看看[問]和[mcve]。 – PJvG
在您的示例中,您以結構化的方式編寫了計算。這個結構是你找到一個算法來做這個計算的起點。 –