代码实现:
方法一:递归——超时
#define min(a, b) ((a) > (b) ? (b) : (a)) int minDays(int n) { if (n == 1 || n == 2) { return n; } if (n % 3 == 0) { // 能被3整除 if (n % 2 == 0) { // 既能被3整除,也能被2整除 return min(min(minDays(n - 1), minDays(n / 2)), minDays(n - 2 * (n / 3))) + 1; } else { // 能被3整除,不能被2整除 return min(minDays(n - 1), minDays(n - 2 * (n /3))) + 1; } } else { // 不能被3整除 if (n % 2 == 0) { // 不能被3整除,能被2整除 return min(minDays(n - 1), minDays(n / 2)) + 1; } else { // 既不能被3整除,也不能被2整除 return minDays(n - 1) + 1; } } }
方法二:记忆化