题目大致上是这样的,两个砝码分别重 a 和 b,a 和 b 不等,放在一块称重量,可以称 a+b 或者 a-b 的货物(假设 a 更大一些)。那么,假设手上有 N 个重量不等的砝码,可以称哪些重量?要求用递归。
举例:手上有 1, 4, 9 三个砝码,那么可以称 3, 5, 8, 10, 13 五种重量的货物。
这道题目我倒是做出来了,但是感觉效率很低:
大致上是两个函数,第二个是真正的递归函数:
用的是自己写的伪代码,所谓insert()
就是把两个砝码能够称的重量塞进一个 set 中(这样就不会有重复了),而 a exclude A 就是集合 a 把 A 元素去除掉之后得到的子集合。
void generateWeights(set<int> a) {
if (a.size() == 2) {
insert(X+a1, X-a1);
}
else {
for A in a {
generateWeightsHelper(A, a exclude A);
}
}
}
void generateWeightsHelper(int b, set<int> a) {
if (a.size() == 1) {
insert(b+a, a-b); // assuming a>b
}
else {
for A in a {
generateWeightsHelper(b, a exclude A);
}
}
}
然后我自己设想了一个案例,跟着函数走了一遍,发现重复运算的很多,比如说 insert(3, 5)就出现了两次。
Example: (1, 4, 9, 15)
Step 1 - generateWeightsHelper(1, (4, 9, 15))
Step 1.1 - generateWeightsHelper(1, (4, 9))
Step 1.1.1 - generateWeightsHelper(1, 9) -> Insert(8, 10)
Step 1.1.2 - generateWeightsHelper(1, 4) -> Insert(3, 5)
Step 1.2 - generateWeightsHelper(1, (4, 15))
Step 1.2.1 - generateWeightsHelper(1, 4) -> Insert(3, 5)
Step 1.2.2 - generateWeightsHelper(1, 15) -> Insert(14, 16)
Step 1.3 - generateWeightsHelper(1, (9, 15))
Step 1.3.1 - generateWeightsHelper(1, 9) -> Insert(8, 10)
Step 1.3.1 - generateWeightsHelper(1, 15) -> Insert(14, 16)
Step 2 - generateWeightsHelper(4, (1, 9, 15))
// 略
Step 3 - generateWeightsHelper(9, (1, 4, 15))
// 略
请问有什么办法可以把这些重复的去掉?如果能够有想法就最好了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.