第四题

最优分解方案

 [问题描述]

经过第一轮的游戏,不少同学将会获得NOIP2012特别礼物,但这时细心的数学课代表发现了一个问题:留下来的人太多而使礼物数量可能不够,为此,加试了一道数学题:将一个正整数n分解成若干个互不相等的正整数的和,使得这些数的乘积最大,当主持人报出一个n后,请你立即将这个最大值报出来,现请你帮你的好友编一个程序来解决这个问题。

[输入文件]

输入文件中只有1个数n(其中1<=n<=1000)。

[输出文件]

输出文件中也是一个数,是乘积的最大值。

[输入样例]

7

[输出样例]

12 

 

 

[注释]

3+4=7,12=3*4

 

 一眼看去还是动归,,,但是划分型dp怎么说也是立方的复杂度所以这次我没有那么固执,,,想到了贪心

首先肯定是除了1以外分的数越多越好。。。那么也就是拆成2,3,4,5序列最好。。但是有余下不够怎么办。。因为要保证每个数不想等。。所以从尾部开始依次加1至于为什么不都加给尾部你自己算算看就知道了。。不行还可以打一个暴力。。。

代码: #include <cstdio>
#include<iostream>
using namespace std;
int main()
{freopen("best.in","r",stdin);
  freopen("best.out","w",stdout);


    int f[100]={1},a[60],i,N,L;
    scanf("%d",&N);
    for (i=0;N>=0;N-=i+2,i++) a[i]=i+2;
    L=i-1;
    N+=a[L];
    while (N>0)
        for (i=L-1;N&&i>=0;N--,i--) a[i]++;
    for (N=0;N<L;N++)
    {
        for (i=0;i<100;i++) f[i]*=a[N];
        for (i=0;i<100;i++)
            if (f[i]>9)
            {
                f[i+1]+=f[i]/10;
                f[i]%=10;
            }
    }
    for (i=99;f[i]==0;i--);
    for (;i>=0;i--) printf("%d",f[i]);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值