.NET Fiddle

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
					
public class Program
{
	public static void Main()
	{
		var listaValores = new List<Dados>()
        {
            new Dados { Id = 1, Valor = 100.00M},
            new Dados { Id = 2, Valor = 200.00M},
            new Dados { Id = 3, Valor = 300.00M},
            new Dados { Id = 4, Valor = 400.00M},
            new Dados { Id = 5, Valor = 500.00M}
        };


		var soma = 1000;
		foreach (string s in OterCombinacoes(listaValores, soma, ""))
		{
			Console.WriteLine($"Somando os valores do id {s} totalizando os {soma}");
		}
	}
	
	public static IEnumerable<string> OterCombinacoes(List<Dados> dados, decimal sum, string values)
	{
		for (int i = 0; i < dados.Count; i++)
		{
			decimal resto = sum - dados[i].Valor;
			string vals = dados[i].Id + "," + values;
			if (resto == 0)
			{
				yield return vals;
			}
			else
			{
				List<Dados> dadosPossiveis = dados.Take(i).Where(n => n.Valor <= sum).ToList();
				if (dadosPossiveis.Count > 0)
				{
					foreach (string s in OterCombinacoes(dadosPossiveis, resto, vals))
					{
						yield return s;
					}
				}
			}
		}
	}
}

public class Dados
{
	public int Id { get; set; }
	public decimal Valor { get; set; }
}
;