最大乘积

【问题描述】
    一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。
    现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
【输入】
只一个正整数n,(3≤n≤10000)。
【输出】
第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
第二行是最大的乘积。
【样例】
输入:
10
输出:
2 3 5
30

这道题可以用dp做,也可以找出规律,那么就是一个数如果尽量的拆分成从2+3+4+5......这样的格式,

可以推出n可以从2加到几,这里我是解了一个二次方程,设从n=2加到k,那么(2+k)*(k-1)/2=n,那么把k解出来就行了,不知道如何解二次方程的自行百度。

然后有可能从2加到k不是刚好等于n,那么剩下的,就及有先后面的加数的方法平均分配。

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 int n=0,tot=0,sum[10003];
 9 int ans[251],che[251];
10 
11 
12 int main( ){
13     scanf("%d",&n);
14     double gs=(double)n*2+2;gs=(double)1+4*gs;gs=sqrt(gs);gs=(-1+gs)/2;
15     int tot=(int)gs;
16     int fen=n-((tot+2)*(tot-1)/2);
17     int jia=fen/(tot-1),sy=fen-(tot-1)*jia;
18     for(int x=2;x<=tot;x++)sum[x]=x+jia;
19     for(int x=tot;x>tot-sy;x--)sum[x]++;
20     ans[0]=1,ans[1]=1;
21     for(int x=2;x<=tot;x++){
22         cout<<sum[x]<<" ";
23         memset(che,0,sizeof(che));
24         for(int y=1;y<=ans[0];y++)che[y]=ans[y]*sum[x];
25         int cnt=1;
26         while(1){
27             if(cnt>ans[0]&&che[cnt]==0)break;
28             ans[cnt]=che[cnt]%10;
29             che[cnt+1]+=che[cnt]/10;
30             cnt++;
31         }
32         ans[0]=cnt-1;
33     }cout<<endl;
34     for(int x=ans[0];x>=1;x--)cout<<ans[x];
35 
36 }
原文地址:https://www.cnblogs.com/Ateisti/p/5791082.html