Это уже довольно просто, с помощью рекурсии мы можем просто проверить все возможности, за один шаг мы можем либо отрезать кусок длины a
, b
или c
, поэтому из проблемы размера n
мы получить sup-проблему меньшего размера n-x
Конечно, нам нужен базовый случай, поэтому, когда n=0
мы добились успеха, мы можем вернуть 0
, в случае n < 0
мы потерпели неудачу, поэтому мы можем вернуть некоторую константу отрицательной бесконечности.
Пример псевдокода:
int solve(int n){
if(n < 0) return -123456789; //-Infinity
if(n == 0) return 0;
return 1 + max(solve(n-a), solve(n-b), solve(n-c));
}
переход в динамический режим c программирование так же просто, как создание таблицы поиска мемо
int solve(int n){
if(n < 0) return -123456789; //-Infinity
if(n == 0) return 0;
if(n in memo)return memo[n]
return memo[n] = 1 + max(solve(n-a), solve(n-b), solve(n-c));
}