Я полагаю, вы имеете в виду, что в таблице [i, j] хранится количество способов получить значение ровно i центов, используя только монеты {0, 1, 2, ..., j - 1}.
По сути, внутренняя часть цикла while говорит, что таблица [i, j] должна равняться числу способов достижения значения i без использования какой-либо монеты j, плюс количество способов достижения значенияя использую хотя бы одну монету достоинством S [j].Следовательно, за исключением граничных случаев, значение равно table [i, j - 1] + table [i - S [j], j];первая часть суммы представляет собой количество способов достижения i, не используя монеты со значением S [j], а вторая часть представляет собой количество способов достижения i, используя по меньшей мере одну монету со значением S [j].
Попробуйте изменить:
// second sub-problem
// count(n-S[m], m)
if (j - 1 <= -1) // rule 3
total += 0;
else if (i - S[j - 1] == 0) // rule 1
total += 1;
else if (i - S[j - 1] <= -1) // rule 2
total += 0;
else
total += table[i - S[j-1], j];
на:
// second sub-problem
// count(n-S[m], m)
if (i - S[j] == 0) // rule 1
total += 1;
else if (i - S[j] < 0) // rule 2
total += 0;
else
total += table[i - S[j], j];
К вашему сведению, обычно пишется что-то вроде (j <0), а не (j <= -1). </p>