最优分解方案
[问题描述]
经过第一轮的游戏,不少同学将会获得圣诞特别礼物,但这时细心的数学课代表发现了一个问题:留下来的人太多而使礼物数量可能不够,为此,加试了一道数学题:将一个正整数n分解成若干个互不相等的正整数的和,使得这些数的乘积最大,当主持人报出一个n后,请你立即将这个最大值报出来,现请你帮你的好友编一个程序来解决这个问题。
输入输出
[输入文件]
输入文件best.in中只有1个数n(其中1<=n<=1000)。
[输出文件]
输出文件best.out中也是一个数,是乘积的最大值。
样例 Sample
[输入样例]
7
[输出样例]
12
分析
该题直接将数分解成从2开始连续的数字,如果不足以连续则将最后一个数字从后向前一次分给每个数一个1.知道分完;
注意要加高精。
代码如下
program best;
type ar=array[0..10000] of longint;
var n,sum,total,now,i,j:longint;
ans:ar;
num:array[1..10000] of longint;
procedure mutiply(var ans:ar;x:longint);
var i:longint;
begin
for i:=1 to ans[0] do
begin
ans[i]:=ans[i]*x;
end;
for i:=1 to ans[0]+20 do
begin
ans[i+1]:=ans[i+1]+(ans[i] div 10);
ans[i]:=ans[i] mod 10;
end;
ans[0]:=ans[0]+20;
while (ans[0]>0) and (ans[ans[0]]=0) do dec(ans[0]);
end;
begin
readln(n);
now:=2;
sum:=0;
while n<>0 do
begin
if n>now
then
begin
inc(sum);
num[sum]:=now;
n:=n-now;
now:=now+1;
end
else
begin
inc(sum);
num[sum]:=n;
n:=0;
end;
end;
while (sum>1) and (num[sum]<=num[sum-1]) do
begin
j:=sum-1;
while (j>0) and (num[sum]>0) do
begin
num[j]:=num[j]+1;
num[sum]:=num[sum]-1;
j:=j-1;
end;
if num[sum]=0 then dec(sum);
end;
ans[1]:=1;
ans[0]:=1;
for i:=1 to sum do
begin
mutiply(ans,num[i]);
end;
for i:=ans[0] downto 1 do
write(ans[i]);
end.
╮(╯﹏╰)╭
___
`-._\ / `~~"--.,_
------>| `~~"--.,_
_.-'/ '.____,,,,----"""~~```'
萝卜,嘿嘿