Diving Board

16.11 Diving Board: You are building a diving board by placing a bunch of planks of wood end-to-end. There are two types of planks, one of length shorter and one of length longer. You must use exactly K planks of wood. Write a method to generate all possible lengths for the diving board.
  • Not the most efficient, but we can build a B-tree that expands out to represent the possible combinations given k planks (building k levels in the process.
  • Each node will represent the accumulative length until we get to the leafs. Our final result will be the values of our leafs in the tree.
  • The reason this isn't entirely efficient is because we will obtain so overlap in the sum of the values (2+3) = (3+2), but our tree distinct them as different.
    • The larger the k, the more overlaps.
  • Optimized: With only two possibilities and k levels. The unique combinations made are simple:
    • Ex. len1 = 3, len2 = 4, k = 4
      • Produces unique sums that are reflected by: its key combination:
        • 2222 = 8
        • 2223 = 9
        • 2233 = 10
        • 2333 = 11
        • 3333 = 12
vector<int> build_k_planks(int k, int length1, int length2) {
vector<int> comb (k);
vector<vector<int>> combs;
combs.reserve(k + 1);
fill(comb.begin(), comb.end(), length1);
combs.push_back(comb);
// now modify this vector
for (int i = 0; i < k; i++) {
comb[i] = length2;
combs.push_back(comb);
}
comb.clear();
// now return sum
for (auto i : combs) {
int sum = accumulate(i.begin(), i.end(), 0);
comb.push_back(sum);
}
return comb;
}
int main() {
vector<int> sums = build_k_planks(4, 2, 3);
for (auto i : sums) cout << i << " "; cout << endl;
pause();
sums = build_k_planks(10, 45, 21);
for (auto i : sums) cout << i << " "; cout << endl;
pause();
}