Poj 1032
传送门
数论 拆分整数 求拆分后的最大乘积
参考 我是链接
算法:数论。
假设 N = A1+A2+...+An,那么议会正常工作的时间为A1*A2*...*An,所求即为 A1*A2*...*An的最大值。
对任意一个整数a,a=b+c(b>1,c>1),那么b*c>=a,即任意一个数拆为两个数(都大于1)后其乘积大于该数。
因此,我们的目标是求得 N=2+3+4+...+(n-1)+x
因为拆分后的数不能重复,即最后剩余的x要拆为x个1,从后往前分别加到已拆的数中(如果从前往后会出现重复数值)。
当前面的数都已+1,x仍有剩余时,从后往前继续加
例如:
26=2+3+4+5+6+6
2 3 4 5 6
1 1 1 1 1
1
-----------
3 4 5 6 8
1 #include<iostream> 2 using namespace std; 3 4 int main(){ 5 int N; 6 int num; 7 cin>>N; 8 num=0; 9 int a[100]={0}; 10 a[0]=2; 11 N-=a[num]; 12 while(N>a[num]){ 13 a[num+1]=a[num]+1; 14 num++; 15 N-=a[num]; 16 } 17 while(N){ 18 int k=num-N; 19 for(int i=num;i>k&&i>=0;i--){ 20 a[i]++; 21 N--; 22 } 23 } 24 for(int i=0;i<=num;i++){ 25 cout<<a[i]<<' '; 26 } 27 cout<<endl; 28 }