可重复最优分解问题
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 81920 KByte
总提交 : 107 测试通过 : 32
总提交 : 107 测试通过 : 32
比赛描述
设n是一个正整数。现在要求将n分解为若干个自然数的和,且使这些自然数的乘积最大。
对于给定的正整数n,编程计算最优分解方案。
输入
文件的第1 行是正整数n。
输出
程序运行结束时,将计算出的最大乘积输出。
样例输入
10
样例输出
36
提示
undefined
题目来源
算法实验与题解
/* WA
#include<iostream>
using namespace std;
int main(){
int n,*a,i,j;
cin>>n;
a = new int[n+1];
a[1] = 1;
for(i=2;i<=n;i++){
a[i]=i;
for(j=1;j*2<=i;j++){
if(a[i]<a[j]*a[i-j]){
a[i] = a[j]*a[i-j];
}
}
}
printf("%d\n",a[n]);
delete[] a;
}
*/
#include<iostream>
#define MAX_N 10001
#define LIMIT 10000
int r[MAX_N];
int len;
void mul(int k){
int i;
for(i=0;i<len;i++){
r[i] *= k;
}
for(i=0;i<len;i++){
r[i+1] += r[i]/LIMIT;
r[i] %= LIMIT;
}
while(r[len]){
r[len+1] = r[len]/LIMIT;
r[len] %= LIMIT;
len++;
}
}
void p(int m){
while(m>=7){
m -= 7;
mul(2187);
}
while(m--){
mul(3);
}
}
void print(){
int i;
printf("%d",r[len-1]);
for(i=len-2;i>=0;i--){
printf("%04d",r[i]);
// for(int j=LIMIT/10;j;j/=10){
// printf("%d",r[i]/j);
// r[i] %= j;
// }
}
printf("\n");
}
int main(){
int n,m;
r[0]=len=1;
scanf("%d",&n);
m = n%3;
if(m==0){
p(n/3);
}else if(m==1){
p((n-4)/3);
mul(4);
}else{
p((n-2)/3);
mul(2);
}
print();
}