求一组数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; }