首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何取X量的问题,总结Y的难度

如何取X量的问题,总结Y的难度
EN

Stack Overflow用户
提问于 2015-03-02 17:26:15
回答 1查看 123关注 0票数 1

我有张桌子

->问题(字符串),难度(int,1-10)

我需要创建一个方法,正如标题所提到的,采用X数量的问题,这些问题的难度应该概括为Y

例如:

getQuestions(2,10) -> Question1 (diff: 4),Question2 (diff: 6)

getQuestions(3,15) -> Question3 (diff: 5),Question4 (diff: 5),Question5 (diff: 5)

我怎样才能用LINQ实现这样的目标呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-02 20:23:20

这里有一种方法,使用这里找到的递归解决方案的修改版本:Finding all possible combinations of numbers to reach a given sum

首先,将执行一些快速验证的公共方法,然后调用递归方法来获得结果:

代码语言:javascript
复制
/// <summary>
/// Gets lists of numQuestions length of all combinations 
/// of questions whose difficulties add up to sumDifficulty
/// </summary>
/// <param name="questions">The list of questions to search</param>
/// <param name="numQuestions">The number of questions required</param>
/// <param name="sumDifficulty">The amount that the difficulties should sum to</param>
/// <returns></returns>
public static List<List<Question>> GetQuestions(List<Question> questions,
    int numQuestions, int sumDifficulty)
{
    if (questions == null) throw new ArgumentNullException("questions");

    var results = new List<List<Question>>();

    // Fail fast argument validation
    if (numQuestions < 1 || 
        numQuestions > questions.Count ||
        sumDifficulty < numQuestions * Question.MinDifficulty ||
        sumDifficulty > numQuestions * Question.MaxDifficulty)
    {
        return results;
    }

    // If we only need single questions, no need to do any recursion
    if (numQuestions == 1)
    {
        results.AddRange(questions.Where(q => q.Difficulty == sumDifficulty)
            .Select(q => new List<Question> {q}));

        return results;
    }

    // We can remove any questions who have a difficulty that's higher
    // than the sumDifficulty minus the number of questions plus one
    var candidateQuestions =
        questions.Where(q => q.Difficulty <= sumDifficulty - numQuestions + 1)
            .ToList();

    if (!candidateQuestions.Any())
    {
        return results;
    }

    GetSumsRecursively(candidateQuestions, sumDifficulty, new List<Question>(), 
        numQuestions, results);

    return results;
}

然后是执行繁重工作的递归方法:

代码语言:javascript
复制
private static void GetSumsRecursively(IReadOnlyList<Question> questions, 
    int sumDifficulty, List<Question> candidates, int numQuestions, 
    ICollection<List<Question>> results)
{
    int candidateSum = candidates.Sum(x => x.Difficulty);

    if (candidateSum == sumDifficulty && candidates.Count == numQuestions)
    {
        results.Add(candidates);
    }

    if (candidateSum >= sumDifficulty)
        return;

    for (int i = 0; i < questions.Count; i++)
    {
        var remaining = new List<Question>();

        for (int j = i + 1; j < questions.Count; j++)
        {
            remaining.Add(questions[j]);
        }

        var filteredCandidates = new List<Question>(candidates) {questions[i]};

        GetSumsRecursively(remaining, sumDifficulty, filteredCandidates, 
            numQuestions, results);
    }
}

下面是一个示例用法:

代码语言:javascript
复制
public static void Main()
{
    const int numberOfQuestions = 3;
    const int sumOfDifficulty = 15;

    // Since I don't have your table, I'm using a list of objects to fake it
    var questions = new List<Question>();
    for (int i = 1; i < 11; i++)
    {
        questions.Add(new Question {Difficulty = i % 10 + 1, 
            QuestionString = "Question #" + i});
    }

    var results = GetQuestions(questions, numberOfQuestions, sumOfDifficulty);

    // Write output to console to verify results
    foreach (var result in results)
    {
        Console.WriteLine("{0} = {1}", string.Join(" + ", 
            result.Select(r => r.Difficulty)), sumOfDifficulty);
    }
}

为了让你把一切都做好,下面是我用来伪造你的桌子的问题课:

代码语言:javascript
复制
internal class Question
{
    public const int MinDifficulty = 1;
    public const int MaxDifficulty = 10;
    private int _difficulty;

    public int Difficulty
    {
        get { return _difficulty; }
        set
        {
            if (value < MinDifficulty) _difficulty = MinDifficulty;
            else if (value > MaxDifficulty) _difficulty = MaxDifficulty;
            else _difficulty = value;
        }
    }

    public string QuestionString { get; set; }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28815846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档