2013-09-14 4 views
24

У меня есть список с ниже элементов:Key Value Pair Список

{[A,1] ; [B,0] ; [C,0] ; [D,2]; [E,0] ; [F,8]} 

Когда переменная = 3 -> я хочу возвращаемое значение, чтобы быть A, D

Когда переменная = 11 -> возвращаемое значение быть A, D, F

при 2 -> возвращаемое значение будет D

и так далее.

int sum = myList.Sum(x => x.Value) 

Как получить соответствующий ключ (A, D, F)?

+1

Вы написали какой-либо код еще? Просто попробуйте искать [здесь] (http://en.wikipedia.org/wiki/Subset_sum_problem) для начала своего места. – Save

+2

Как вы выбираете эти предметы? сумма()? –

+0

I * think * сумма их значений должна суммироваться с входным значением – Save

ответ

51

Используя один из подмножеств метод this question

var list = new List<KeyValuePair<string, int>>() { 
    new KeyValuePair<string, int>("A", 1), 
    new KeyValuePair<string, int>("B", 0), 
    new KeyValuePair<string, int>("C", 0), 
    new KeyValuePair<string, int>("D", 2), 
    new KeyValuePair<string, int>("E", 8), 
}; 

int input = 11; 
var items = SubSets(list).FirstOrDefault(x => x.Sum(y => y.Value)==input); 

EDIT

полное консольное приложение:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var list = new List<KeyValuePair<string, int>>() { 
       new KeyValuePair<string, int>("A", 1), 
       new KeyValuePair<string, int>("B", 2), 
       new KeyValuePair<string, int>("C", 3), 
       new KeyValuePair<string, int>("D", 4), 
       new KeyValuePair<string, int>("E", 5), 
       new KeyValuePair<string, int>("F", 6), 
      }; 

      int input = 12; 
      var alternatives = list.SubSets().Where(x => x.Sum(y => y.Value) == input); 

      foreach (var res in alternatives) 
      { 
       Console.WriteLine(String.Join(",", res.Select(x => x.Key))); 
      } 
      Console.WriteLine("END"); 
      Console.ReadLine(); 
     } 
    } 

    public static class Extenions 
    { 
     public static IEnumerable<IEnumerable<T>> SubSets<T>(this IEnumerable<T> enumerable) 
     { 
      List<T> list = enumerable.ToList(); 
      ulong upper = (ulong)1 << list.Count; 

      for (ulong i = 0; i < upper; i++) 
      { 
       List<T> l = new List<T>(list.Count); 
       for (int j = 0; j < sizeof(ulong) * 8; j++) 
       { 
        if (((ulong)1 << j) >= upper) break; 

        if (((i >> j) & 1) == 1) 
        { 
         l.Add(list[j]); 
        } 
       } 

       yield return l; 
      } 
     } 
    } 
} 
+0

Спасибо 14V - но что такое подмножества здесь? - Кажется, он не появился в визуальной студии. – user2778395

+1

@ user2778395 Я разместил его ссылку в ответе. Я использовал для версии L.B. – I4V

Смежные вопросы