### You only have free questions left (including this one).

But it doesn't have to end here! Sign up for the 7-day coding interview crash course and you'll get a free Interview Cake problem every week.

You are a renowned thief who has recently switched from stealing precious metals to stealing cakes because of the insane profit margins. You end up hitting the jackpot, breaking into the world's largest privately owned stock of cakes—the vault of the Queen of England.

While Queen Elizabeth has a limited number of types of cake, she has an unlimited supply of each type.

Each type of cake has a weight and a value, stored in objects of a ICKCakeType class:

@interface ICKCakeType : NSObject @property (nonatomic) NSUInteger weight; @property (nonatomic) NSUInteger value; - (instancetype)initWithWeight:(NSUInteger)weight value:(NSUInteger)value; @end @implementation ICKCakeType - (instancetype)initWithWeight:(NSUInteger)weight value:(NSUInteger)value { if (self = [super init]) { self.weight = weight; self.value = value; } return self; } @end

For example:

// weighs 7 kilograms and has a value of 160 shillings [[ICKCakeType alloc] initWithWeight:7 value:160]; // weighs 3 kilograms and has a value of 90 shillings [[ICKCakeType alloc] initWithWeight:3 value:90];

You brought a duffel bag that can hold limited weight, and you want to make off with the most valuable haul possible.

Write a function ICKMaxDuffelBagValue that takes an array of cake type objects and a weight capacity, and returns the maximum monetary value the duffel bag can hold.

For example:

NSArray<ICKCakeType *> *cakeTypes = @[ [[ICKCakeType alloc] initWithWeight:7 value:160], [[ICKCakeType alloc] initWithWeight:3 value:90], [[ICKCakeType alloc] initWithWeight:2 value:15] ]; NSUInteger capacity = 20; // returns 555 (6 of the middle type of cake and 1 of the last type of cake) ICKMaxDuffelBagValue(cakeTypes, capacity);

Weights and values may be any non-negative integer. Yes, it's weird to think about cakes that weigh nothing or duffel bags that can't hold anything. But we're not just super mastermind criminals—we're also meticulous about keeping our algorithms flexible and comprehensive.

Does your function work if the duffel bag's weight capacity is 0 kg?

Does your function work if any of the cakes weigh 0 kg? Think about a cake whose weight and value are both 0.

We can do this in time and space, where n is the number of types of cakes and k is the duffel bag's capacity!

Actually, we don't support password-based login. Never have. Just the OAuth methods above. Why?

1. It's easy and quick. No "reset password" flow. No password to forget.
2. It lets us avoid storing passwords that hackers could access and use to try to log into our users' email or bank accounts.
3. It makes it harder for one person to share a paid Interview Cake account with multiple people.

Actually, we don't support password-based login. Never have. Just the OAuth methods above. Why?

1. It's easy and quick. No "reset password" flow. No password to forget.
2. It lets us avoid storing passwords that hackers could access and use to try to log into our users' email or bank accounts.
3. It makes it harder for one person to share a paid Interview Cake account with multiple people.

time, and space, where n is number of types of cake and k is the capacity of the duffel bag. We loop through each cake (n cakes) for every capacity (k capacities), so our runtime is , and maintaining the array of k+1 capacities gives us the space.

Congratulations! Because of dynamic programming, you have successfully stolen the Queen's cakes and made it big.

Keep in mind: in some cases, it might not be worth using our optimal dynamic programming solution. It's a pretty slow algorithm—without any context (not knowing how many cake types we have, what our weight capacity is, or just how they compare) it's easy to see growing out of control quickly if n or k is large.

If we cared about time, like if there was an alarm in the vault and we had to move quickly, it might be worth using a faster algorithm that gives us a good answer, even if it's not always the optimal answer. Some of our first ideas in the breakdown were to look at cake values or value/weight ratios. Those algorithms would probably be faster, taking time (we'd have to start by sorting the input).

Sometimes an efficient, good answer might be more practical than an inefficient, optimal answer.

1. We know the max value we can carry, but which cakes should we take, and how many? Try adjusting your answer to return this information as well.
2. What if we check to see if all the cake weights have a common denominator? Can we improve our algorithm?
3. A cake that's both heavier and worth less than another cake would never be in the optimal solution. This idea is called dominance relations. Can you apply this idea to save some time? Hint: dominance relations can apply to sets of cakes, not just individual cakes.
4. What if we had an object for every individual cake instead of types of cakes? So now there's not an unlimited supply of a type of cake—there's exactly one of each. This is a similar but harder problem, known as the 0/1 Knapsack problem.