我的算法思想是最优分解问题
问题描述:
设n是一个正整数。现在要求将n分解为若干个互不相同的自然数的和,且使这些自然数的乘积最大。
你的任务是对于给定的正整数n,编程计算最优分解方案。
输入:
输入有若干行,每一行上是一个整数n,(|n|£50)。
输出:
对输入中的每个整数n,如果是无效输入,那么输出“invalid input!”,否则输出最优分解方案,以从小到大的顺序排列,中间用空格阁开,在它们的后面输出最大的乘积m,格式为max=m。
输入样例:
-5
10
1001
输出样例:
invalid input!
2 3 5 max=30
invalid input!
1).把一个正整数从中间分开(如果是偶数,直接除以2;如果是奇数,分别加1除以2,减1除以2)
2).其中一部分保留在mem[]数组中(奇数的话,比较大的那一部分保留给mem[]数组),另一部分赋给temp,并重复1,2 步骤
3).最后把temp赋给mem[]数组
代码: 全选
//11.cpp
#include<iostream>
using namespace std;
int main()
{
const int N=50;
int mem[N];
int n;
while(cin>>n)
{
int temp=n;
int num=0;
if(n<=0||n>50)
cout<<"invalid input!"<<endl;
else
{
while(temp!=1&&temp!=2&&temp!=3&&temp!=4)
{
if(temp%2==0)
{
mem[num++]=temp/2;
temp=temp/2;
}
else
{
mem[num++]=(temp+1)/2;
temp=(temp-1)/2;
}
}
mem[num]=temp;
if(mem[num]==mem[num-1]) //由于要求为不同的自然数,所以有了这一步
{
mem[num]--;
mem[num-1]++;
}
int max=1;
for(int i=0;i<=num;i++)
max*=mem[i];
for(int i=num;i>=0;i--)
cout<<mem[i]<<" ";
cout<<"max="<<max<<endl;
}
}
return 0;
}