用 C++ 实现整数拆分


假设我们有一个正整数 n,我们需要将它拆分成至少两个正整数之和,并最大化这些整数的乘积。我们需要找到可以得到的最大乘积。因此,如果数字为 10,则答案将为 36,因为 10 = 3 + 3 + 4,3 * 3 * 4 = 36

为了解决这个问题,我们将执行以下步骤 -

  • 定义一个方法 solve(),这将获取 n、数组 dp 和标记

  • 如果 n 为 0,则返回 1

  • 如果 dp[n] 不为 -1,则返回 dp[n]

  • 当标记被设置时,end := n – 1,否则 end := n

  • ret := 0

  • 对于范围 1 到 end 内的 i

    • ret := ret 和 i* solve(n – i, dp, false) 的最大值

  • 设置 dp[n] := ret 并返回

  • 从 main 方法中,创建一个大小为 n + 1 的数组 dp,并用 – 1 填充

  • 返回 solve(n, dp)

示例 (C++)

让我们看看以下实施,以便更好地理解 -

 实时演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(int n, vector <int>& dp, bool flag = true){
      if(n == 0) return 1;
      if(dp[n] != -1) return dp[n];
      int end = flag? n - 1: n;
      int ret = 0;
      for(int i = 1; i <= end; i++){
         ret = max(ret, i * solve(n - i, dp, false));
      }
      return dp[n] = ret;
   }
   int integerBreak(int n) {
      vector <int>dp(n + 1, -1);
      return solve(n, dp);
   }
};
main(){
   Solution ob;
   cout << (ob.integerBreak(10));
}

输入

10

输出

36

更新于: 2020 年 5 月 2 日

225 次查看

开启你的职业

完成课程以获得认证

开始操作
广告