November 30, 2021 Rookie SRM 7 Editorial


This problem, like many easy problems in rookie SRMs, is really just a warm-up to get into the flow. In a single line, one can write out the code doing exactly what the problem statement requests:

public int updateBalance(int startingBalance, int debits, int checks) {
  return startingBalance - debits - checks;


Here we need to be careful to count each number, but ignore if we’ve seen it before. We can do this in several different ways, either by keeping a list of numbers we have seen, perhaps by making a set, or even by sorting the list and looking for differences.

The solution below uses the sorting approach:

public int getSum(int[] values) {
  int ret = values[0];
  for (int i = 1; i < values.length; i++)
    if (values[i] != values[i - 1]) ret += values[i];
  return ret;


This is a classic dynamic programming type of problem. For any given total, we can imagine choosing if our “last” package purchased was of size1, size2, etc. If we already know the best answer for each of the smaller totals, we can then pick whichever option is most optimal. In this way, we can start at 0 and work our way up to total. We need to keep in mind returning -1 in cases that aren’t possible, and we do this with a large sentinel value:

public int getMinimum(int[] sizes, int total) {
  if (total == 0) return 0;
  int[] min = new int[1001];
  for (int i = 1; i <= 1000; i++) {
    min[i] = 9999;
    for (int j = 0; j < sizes.length; j++)
      if (sizes[j] <= i)
        min[i] = Math.min(min[i], min[i - sizes[j]] + 1);
  return min[total] < 9999 ? min[total] : -1;


Guest Blogger


Sign up for the Topcoder Monthly Customer Newsletter

Thank you

Your information has been successfully received

You will be redirected in 10 seconds