【贪心】 poj 1032 和为n的若干数最大乘积

给出n,把n分解为若干不相同数之和,使之乘积最大。
贪心,Discuss里面的思路:把n分解为从2开始的连续整数,如果有多,则从高位开始依次加1。如26,我们得到2+3+4+5+6,此时还剩余6(26-2-3-4-5-6),接下来从高位依次加一,变成3+4+5+6+7,还剩1,继续加给最大的7,最后答案是3+4+5+6+8

 

#include <iostream>

#include <cstdio>

using namespace std;

int main()

{

//      freopen("in.txt","r",stdin);

    int m,s=0,cnt=0,i,sum,j;

    cin >> m;

    for(i=2;;i++)

    {

        s+=i;

        cnt++;

        if(s>m)

        {

            s=s-i;    //9

            i--;    //4

            cnt--;    //3

            break;

        }

    }

//     cout << s << endl;

//     cout << i << endl;

//     cout << cnt << endl;

    s=m-((i)*(i+1)*0.5-1);

//    cout << s << endl;

    sum=s/cnt;  //6

    if(sum>0)

    {

        s=s-sum*cnt; //2

    }

//    cout << sum << endl;

//    cout << s << endl;

    cout << (2+sum);

    for(j=3;j<=i-s;j++)

    {

        cout << ' ' << (j+sum);

    }

    for(j=i-s+1;j<=i;j++)

    {

        cout << ' ' << (j+sum+1);

    }

    return 0;

}

 

你可能感兴趣的:(poj)