且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

找到所有的方法,总结给定的数字(以允许重复)从给定

更新时间:2023-02-10 11:25:05

如果你愿意原谅看中LINQ的技巧,你可能会发现这个C#的解决方案非常有用。幸运的是LINQ读取有点像英语。我们的想法是,直到达到其正确的价值建立起来的解决方案, K 从0开始递增。对每个值k 建立在previous解决方案。有一件事你必须留意,虽然是为了确保新的办法你发现没有被重新排序他人。我解决了这个只计算其作为有效的,如果他们来分类的。 (这是只有一个单一的比较)

If you're willing to excuse the fancy linq tricks, you might find this C# solution useful. Fortunately linq reads kind of like english. The idea is to build up the solutions as k starts from 0 and increments until it reaches its correct value. Each value of k builds on the previous solutions. One thing you have to watch for though is to ensure that the new "ways" you're finding are not re-orderings of others. I solved that by only counting them as valid if they're sorted. (which was only a single comparison)

void Main() {
    foreach (int[] way in GetSumWays(new[] {1, 2}, 6)) {
        Console.WriteLine (string.Join(" ", way));
    }
}

int[][] GetSumWays(int[] array, int k) {
    int[][][] ways = new int[k + 1][][];
    ways[0] = new[] { new int[0] };

    for (int i = 1; i <= k; i++) {
        ways[i] = (
            from val in array
            where i - val >= 0
            from subway in ways[i - val]
            where subway.Length == 0 || subway[0] >= val
            select Enumerable.Repeat(val, 1)
                .Concat(subway)
                .ToArray()
        ).ToArray();
    }

    return ways[k];
}

输出:

1 1 1 1 1 1
1 1 1 1 2
1 1 2 2
2 2 2

它采用了动态规划方法,并应该比一个天真的递归方法更快。我觉得。我知道它的速度不够快计数的方式,打破了美元在几毫秒数。 (242)

It uses a dynamic programming approach and should be faster than a naive recursive approach. I think. I know it's fast enough to count the number of ways to break a dollar in a few milliseconds. (242)