题目
设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,使这些自然数的乘积最大。
输入 10
输出 30
#include<bits/stdc++.h>
using namespace std;
int num[1000],index=1;
int solve(int n)
{
if(n==1) return 1;
int tep=2;
num[index]=tep;
n-=2;
while(n)
{
if(n-(tep+1)>tep+1)
n-=tep+1,num[++index]=tep+1,tep=tep+1;
else
num[++index]=n,n=0;
}
int res=1;
for(int i=1;i<=index;i++)
res*=num[i];
return res;
}
int main()
{
//freopen("input4-15.txt","r",stdin);
//freopen("output4-15.txt","w",stdout);
int n;
scanf("%d",&n);
int ans=solve(n);
printf("%d\n",ans);
return 0;
}
如果没有要求分解出的数字不同,那么就是分解成2和3,并且优先分配3,举个例子,对12分成4个3或者6个2,4个3的乘积更大
所以只要考虑对3取余的余数是多少
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,res=0;
scanf("%d",&n);
if(n%3==0)
res=ceil(pow(3,n/3));
else if(n%3==1)
res=4*ceil(pow(3,(n-4)/3));
else
res=2*ceil(pow(3,(n-2)/3));
printf("%d\n",res);
}