给定一个整数 要求拆分多少项 然后求最大乘积
这个有一个困难就是考虑 分成多少项 当分的项可以是为1时
首先明晰这个a[i] 是 数字i 可以被拆分得到的最大乘积
int n; cin >> n;// 被分解的数
a[1] = 1, a[2] = 2;// 1 2 都只有一种分法
for(int i = 3; i <= n; i++)
{
for(int j= 1; j <= i/2; j++)
{
a[i] = MAX(a[i], a[i-j] * a[j], i);// 这里MAX是自己定义的三个函数值返回最大的一个值 也可用两层max 这里介绍下含义 第i 个数分解的最大值 可能是 i 本身 也就是不分解 还可能是 分解成两个 两个以上 而这个a[i-j] * a[j] 就是分解成两个或以上的最大值
}
}
for(int i = 1; i <= n; i++)
{
cout << a[i] << ' ';
}
因为上述代码中 有个i 也就是不分解 所以 上述是最少分解成一个数的最大乘积
如果是至少分解成两项
#include<bits/stdc++.h>
using namespace std;
typedef struct ListNode *List;
typedef long long ll;
const int MX = 1e4;
int a[MX];
int n, m;
ll sum;
int MAX(int x, int y, int z)
{
return x > y ? x > z ? x : z : y > z ? y : z;
}
int main()
{
int n; cin >> n;
a[2] = 1;
for(int i = 3; i <= n; i++)
{
for(int j = 1; j <= i/2; j++)
{
a[i] = MAX(a[i], a[i-j]*j, (i-j)*j);
/*这里的a[i] 表示 i 至少分解为两项时的最大值
上述要么是分解成i-j 和 j -- 两项
要么是三项及以上
为什么这里的j 不用分解 因为在从小到大的遍历中 其实相当于把j 分解的那部分放到了a[i-j]中
例如 数字9 是 3 3 3 那我 6 * a[3] 和 3 * a[6] 其实都一样 只不过我把这个j的分解
放到了 i-j的分解中 因为他最大值的分解方式是确定 比如10 无论你怎么弄 肯定是分解成两个3一个4
*/
}
}
return 0;
}