Description
设n是一个正整数。现要求将n分解成若干个自然数的和,且使这些自然数的乘积最大。编程计算n的最优分解方案。
Input
输入的第一行是一个正整数k,表示测试数据组数;接下来是k组测试数据,每组测试数据为一行,包含一个整数n(1<=n<=100),表示待分解的正整数n。
Output
每组测试数据输出一行,包含一个整数,表示最大乘积。
Sample Input
2 3 10
Sample Output
3 36
KEY:用数组f[i]记住i个最佳分解方案,然后用做一张表,来计算……(注意数据量有点大)
Source:
#include < iostream >
using namespace std;
unsigned long long f[ 101 ] = ... {0,1,2,3,4,6} ;
void GetList()
... {
int i,j,k;
for(k=6;k<=100;k++)
...{
f[k]=k;
for(i=2;i<=k/2;i++)
...{
j=k-i;
if(f[i]*f[j]>f[k]) f[k]=f[i]*f[j];
}
}
}
int main()
... {
// freopen("fjnu_1393.in","r",stdin);
GetList();
int N;
cin>>N;
int n;
for(int i=1;i<=N;i++)
...{
cin>>n;
printf("%lld ",f[n]);
}
return 0;
}