任意数相加算法有关问题

任意数相加算法问题
19个数,任意个数相加,要求选出等于一个定数的组合。19个数最大2万,最小500,小数点不超过2位。求大神这算法怎么弄?
由于个数不定,用排列组合数量会非常大,没什么思路。
------解决思路----------------------


private List<string> GetPlusRet(Single CosData, params string [] strDatas)
        {
            List<string> retdata = new List<string>();

            List<Single> lstSig = new List<Single>();

            //WriteCombinations<string>(strDatas, 3);

            var c = new string[] { "14", "4.3", "12", "21.7" };
            for (Int32 i = 1; i <= 4; i++)
            {
                WriteCombinations<string>(c, i, CosData);
            }
            


            return retdata;
        }

        static void WriteCombinations<T>(T[] array, int length,Single Data)
        {
            var combinations = new Combinations<T>(array, length);
            foreach (var oneCom in combinations)
            {
                var sb = new StringBuilder();
                Single ret = 0;
                foreach (T item in oneCom)
                {
                    ret += Convert.ToSingle(item.ToString());
                    sb.Append(item.ToString() + ",");
                }
                if (sb.Length > 0) sb.Remove(sb.Length - 1, 1);
                if (Data == ret)
                    Console.WriteLine(ret.ToString());
                Console.WriteLine(sb.ToString() );
            }
            Console.WriteLine(combinations.ToString());
            Console.WriteLine();
        }


        public class Combinations<T>
        {
            #region メンバ
            private IList<T> _items;
            private int _length;
            private List<IList<T>> _combinations;
            private int[] _finalIndices;
            #endregion

            #region コンストラクタ
            public Combinations(IList<T> items) : this(items, items.Count) { }
            public Combinations(IList<T> items, int select)
            {
                if (select < 0)
                    throw new ArgumentException("選択要素数は、0以上でなくてはなりません。");
                if (items.Count < select)