the search space
Before you can search for an answer, you have to know what you are searching through. The search space is the set of all candidate solutions the problem allows — every place the real answer could possibly be hiding. For a padlock it is the 1000 codes; for seating n guests it is the n! orderings; for picking some items from a set of n it is the 2^n subsets. Picture a vast warehouse where the right box is somewhere on the shelves; the search space is the full inventory of boxes you might have to open.
Two things about a search space drive everything: its structure and its size. Structure is how candidates relate — subsets differ by adding or removing one element, permutations by swapping two positions, partial solutions by extending one more step. Good structure lets you walk the space systematically and, crucially, skip whole shelves at once. Size is just how many candidates there are, and it usually grows brutally with the input: choosing yes/no for each of n items gives 2^n candidates (the powerset), arranging n items gives n!, assigning one of k labels to each of n items gives k^n. These counts are not incidental — they are why brute force is exponential.
Almost every technique in algorithm design is, at heart, a statement about the search space: divide and conquer splits it, greedy commits to one path through it, dynamic programming reuses overlapping regions of it, and backtracking prunes away branches of it that cannot contain a solution. Sizing the search space honestly — is it 2^n, n!, polynomial? — is the first sober step in deciding whether exhaustive search is even an option or whether you must be cleverer.
For the 0/1 knapsack with n = 30 items, the search space is the 2^30 subsets — about a billion. A blind enumeration touches each, which is borderline feasible. At n = 60 it is 2^60, about 10^18, hopeless to enumerate; this is the gap where meet-in-the-middle (search two halves of 2^30 each) or dynamic programming earns its keep.
Always size the search space first: 2^30 is a tough afternoon, 2^60 is geological time.
A bigger search space is not automatically a harder problem — sometimes structure lets you ignore almost all of it (sorted data shrinks a search to O(log n)); brute force is only the cost when no structure is exploited.