ACM-ICPC 2010 国内予選問題 Problem C ポロック予想

Problem C ポロック予想

動的計画法。和がnになる正四面体数の最小個数をAnとし、n以下の正四面体数の集合をT(n)とすると、
An = mint∈T(n)(An-t+1)。
奇数のみの場合も同様。

#include <iostream>

using namespace std;

int main()
{
    const int N = 1000000;

    static int A[N];    //  正四面体数の個数
    static int B[N];    //  奇数の正四面体数の個数
    A[0] = B[0] = 0;

    for ( int i=1; i<N; i++ )
    {
        A[i] = B[i] = i;

        for ( int j=1; ; j++ )
        {
            int t = j*(j+1)*(j+2)/6;
            if ( t > i )
                break;

            A[i] = min( A[i], A[i-t]+1 );
            if ( t%2 == 1 )
                B[i] = min( B[i], B[i-t]+1 );
        }
    }

    while ( true )
    {
        int n;  cin >> n;
        if ( n == 0 )
            break;

        cout << A[n] << " " << B[n] << endl;
    }
}