AOJ 1167 - Pollock's conjecture

やるだけ.

解法

100,000より大きい正四面体数はいらない.100,000以下の正四面体数は180個で,そのうち45個が奇数である.
数が少ないので,個数制限なしリュックサックナップサック(2015/10/15訂正)問題っぽく解ける.

コード

#include <cstdio>
#include <vector>

const int INF = 1001001001;

std::vector<int> A, B;
int dp[2][1000001], dp2[2][1000001];

void DP(int (&dp)[2][1000001], std::vector<int> &v){
    for(int i=0;i<=1000000;i++){
        dp[0][i] = INF;
    }
    dp[0][0] = 0;

    int L = v.size();
    int prev = 0, next = 1;
    for(int i=0;i<L;i++){
        for(int j=0;j<=1000000;j++){
            dp[next][j] = dp[prev][j];
            if(j-v[i] >= 0){
                dp[next][j] = std::min(dp[next][j], dp[next][j-v[i]] + 1);
            }
        }

        prev = !prev;
        next = !next;
    }
}

int main(){
    for(int i=1;;i++){
        long long x = 1ll * i * (i+1) * (i+2) / 6;
        if(x <= 1000000ll){
            A.push_back(x);
            if(x & 1){B.push_back(x);}
        }else{
            break;
        }
    }
    
    DP(dp, A);
    DP(dp2, B);
    
    int N;
    while(scanf("%d", &N), N){
        printf("%d %d\n", dp[0][N], dp2[0][N]);
    }
}