麻烦计算机高手们帮我解决一个Pascal程序题

来源:百度知道 编辑:UC知道 时间:2024/06/06 17:58:01
“调解委员会”。某一个岛国的国会由N个代表组成,根据现在的法规代表们应该被分成代表人数不同的组,每天每一个组派一个代表去调解委员会。调解委员会组员的组合每一天应该是不同的,当这种安排结束时,调解委员会的工作将结束。你的任务就是去确定每个组的代表人数,以使调解委员会的工作最长。
输入
输入文件包含一个整数N(5=<N<=1000)。
输入
输出文件为1行,是最长工作时间分组中由小到大的每组代表人数。
输入输出示例#1
input.txt
7
output.txt
3 4
输入输出示例#2
input.txt
31
output.txt
2 3 5 6 7 8
最好写完整,谢谢

题目的意思是让我们找到x1+x2+...+xk=n(xi为互不相等的自然数),使x1*x2*...*xk的值最大,用动态规划可解.
用dp[i,j]表示把数i拆成若干个互不相等且不大于j的数所能得到的乘积最大值(实际数太大,取对数后用real记录),用数组f[i,j]记录使dp[i,j]取到最大值时,把i拆分成的若干个数中,最大的那个数.

状态转移过程:
if dp[i,j-1]>dp[i-j,j-1]+ln(j)
__then_begin
_________dp[i,j]:=dp[i,j-1];
_________f[i,j]:=f[i,j-1];
_______end
__else_begin
_________dp[i,j]:=dp[i-j,j-1]+ln(j);
_________f[i,j]:=j;
_______end;

最后利用f[i,j]倒推即可输出答案,注意边界处理.