南邮 OJ 1272 可重复最优分解问题

可重复最优分解问题

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 81920 KByte
总提交 : 107            测试通过 : 32 

比赛描述

n是一个正整数。现在要求将n分解为若干个自然数的和,且使这些自然数的乘积最大。

对于给定的正整数n,编程计算最优分解方案。



输入

文件的第行是正整数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();
}






你可能感兴趣的:(ACM,南邮OJ,可重复最优分解问题)