1167:Pollock's conjecture

問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1167&lang=jp




















典型的な動的計画法
i * ( i + 1 ) * ( i + 2 ) / 6 円玉で n 円作るときの最小枚数。

dp1[作る正整数]:=正四面体の最小個数
dp2→奇数しか使えないとき

#include<iostream>
#include<algorithm>

#define INF 10000000

#define rep(i,n) for(int i=0;i<n;i++)

using namespace std;

int main(void){
	
	static int dp1[1000001],dp2[1000001],n,four[501];
	
	fill(four,four+501,0);
	fill(dp1,dp1+1000001,INF);
	fill(dp2,dp2+1000001,INF);
	
	rep(i,501)four[i]=i*(i+1)*(i+2)/6;
	
	dp1[0]=dp2[0]=0;
	
	for(int i=1;i<1000001;i++){
		for(int j=1;four[j]<=i;j++){
			dp1[i]=min(dp1[i],dp1[i-four[j]]+1);
			if(four[j]%2)dp2[i]=min(dp2[i],dp2[i-four[j]]+1);
		}
	}
	
	while(cin >> n,n)cout << dp1[n] << " " << dp2[n] << endl;
	
	return 0;
}