C语言输入一个大于1的整数n,将n分为若干个正整数之和可能有很多种结果,取使这些数相乘最大的结果
时间: 2023-06-27 08:06:16 浏览: 134
这道题目可以使用动态规划来解决。
首先我们可以定义一个数组 dp,其中 dp[i] 表示将数字 i 分解成若干个正整数之和后,这些正整数的乘积的最大值。
对于数字 i,我们可以将其分解成若干个正整数之和。假设其中一个正整数为 j,那么另外一个正整数必定为 i-j。因此,可以将问题转化为求 j 和 i-j 的乘积的最大值。
我们可以枚举 j 的取值范围,从而得到 dp[i] 的值。具体地,dp[i] 的值应该为 max(j * (i-j), j * dp[i-j]),其中 j 的取值范围为 1 到 i-1。
最终,dp[n] 就是将 n 分解成若干个正整数之和后,这些正整数的乘积的最大值。
下面是 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
int main()
{
int n;
scanf("%d", &n);
int* dp = (int*)malloc((n+1) * sizeof(int));
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = 0;
for (int j = 1; j <= i-1; j++) {
dp[i] = max(dp[i], max(j * (i-j), j * dp[i-j]));
}
}
printf("%d\n", dp[n]);
free(dp);
return 0;
}
```
阅读全文