/// <param name="remain">Оставшаяся часть нашего числа</param>
/// <param name="maxTerm">Максимальный размер слагаемого</param>
/// <param name="terms">Список слагаемых</param>
static void Solve(int remain, int maxTerm, List<int> terms)
{
//Если от числа ничего не осталось, выводим все слагаемые и выходим из функции
if (remain == 0)
{
Console.WriteLine(string.Join(" + ", terms));
return;
}
//Перебираем возможные слагаемые от наибольшего до 1
for (int term = maxTerm; term >= 1; term--)
{
if (term <= remain)
{
terms.Add(term);
Solve(remain - term, term, terms);
terms.Remove(term);
}
}
}
var partitions = new List<int>();
Solve(n, n, partitions); //n - число для которого нужно найти разбиения
class Order
{
public int id;
public string sku;
public int sum;
}
class Program
{
static void Main(string[] args)
{
List<Order> orders = new List<Order>()
{
new Order()
{
id = 1,
sku = "AR",
sum = 100
},
new Order()
{
id = 2,
sku = "PR",
sum = 200
},
new Order()
{
id = 1,
sku = "VR",
sum = 150
}
};
var result = orders.GroupBy(i => i.id).
Select(i => new
{
id = i.Key,
sum = i.Sum(s => s.sum),
sku = i.Select(s => s.sku)
});
}
}