更新时间: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)