求一组数2,3,...,w
1>.如果它们的和等于n,那么这组数就是使得乘积最大的数。
2>如果它们的和为sum,且n-sum==w,那么使得乘积最大的数为3,4,...,w,w+2,即前面几个数加1,最后一个数加2
3>如果它们的和为sum,且n-sum<w,那么就将这n-sum个1分别加到这组数的后n-sum个数上。
证明:http://blog.himdd.com/archives/1918
http://yjq24.blogbus.com/logs/41658049.html
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
int num[1010];
int n,i,j,s,t,k,v;
while(~scanf("%d",&n)){
memset(num,0,sizeof(num));
for(s=j=0,i=2;;i++){
s+=i;
num[j++]=i;
if(s>n) break;
}
t=n-(s-i),v=i-1;
//printf("%d %d\n",t,v);
if(t==v){
for(i=1;i<j-1;i++){
printf("%d ",num[i]);
}
printf("%d",v+2);
}else{
for(i=t,k=j-2;i>0;i--,k--){
num[k]+=1;
}
printf("%d",num[0]);
for(i=1;i<j-1;i++){
printf(" %d",num[i]);
}
}
printf("\n");
}
return 0;
}