最优分解方案
[问题描述]
经过第一轮的游戏,不少同学将会获得NOIP2012特别礼物,但这时细心的数学课代表发现了一个问题:留下来的人太多而使礼物数量可能不够,为此,加试了一道数学题:将一个正整数n分解成若干个互不相等的正整数的和,使得这些数的乘积最大,当主持人报出一个n后,请你立即将这个最大值报出来,现请你帮你的好友编一个程序来解决这个问题。
[输入文件]
输入文件中只有1个数n(其中1<=n<=1000)。
[输出文件]
输出文件中也是一个数,是乘积的最大值。
[输入样例]
7
[输出样例]
12
[注释]
3+4=7,12=3*4
一眼看去还是动归,,,但是划分型dp怎么说也是立方的复杂度所以这次我没有那么固执,,,想到了贪心
首先肯定是除了1以外分的数越多越好。。。那么也就是拆成2,3,4,5序列最好。。但是有余下不够怎么办。。因为要保证每个数不想等。。所以从尾部开始依次加1至于为什么不都加给尾部你自己算算看就知道了。。不行还可以打一个暴力。。。
代码: #include <cstdio>
#include<iostream>
using namespace std;
int main()
{freopen("best.in","r",stdin);
freopen("best.out","w",stdout);
int f[100]={1},a[60],i,N,L;
scanf("%d",&N);
for (i=0;N>=0;N-=i+2,i++) a[i]=i+2;
L=i-1;
N+=a[L];
while (N>0)
for (i=L-1;N&&i>=0;N--,i--) a[i]++;
for (N=0;N<L;N++)
{
for (i=0;i<100;i++) f[i]*=a[N];
for (i=0;i<100;i++)
if (f[i]>9)
{
f[i+1]+=f[i]/10;
f[i]%=10;
}
}
for (i=99;f[i]==0;i--);
for (;i>=0;i--) printf("%d",f[i]);
return 0;
}