第一种方法,暴力递归
class Solution {
public:
int max2(int a, int b, int c) {
return(max(a, b), c);
}
//递归函数integerBreak的意义为:找到n拆分的最大值(最少拆成两个数),第一种情况为分为拆成
//i*(n-i),第二种情况为拆分为i*integerBreak(n-i)。
int integerBreak(int n) {
if (n == 1) return 1;
int res = -1;
for (int i = 1; i < n;i++) {
res = max2(res,i * (n - i), i * integerBreak(n - i));
}
return res;
}
};
int main() {
Solution solution;
int res = solution.integerBreak(3);
return 0;
}
第二种方法,动态规划
//343整数拆分
class Solution {
public:
int max2(int a, int b, int c) {
return(max(a, b), c);
}
int integerBreak(int n) {
vector<int> memo(n + 1, -1);
memo[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i - 1; j++) {
//递推公式
memo[i] = max2(memo[i], j * (i - j), j * memo[i - j]);
}
}
return memo[n];
}
};
int main() {
Solution solution;
int res = solution.integerBreak(3);
return 0;
}
关于递推公式的说明