解法
25が3倍がないので特殊処理。
うーんもう少し綺麗な処理にならないかなこれ。
全部の組み合わせを作り一つ一つsortして末尾が2倍のだけ残してfindallでまとめてsortで重複を消して数えれば綺麗になるか。
この場合計算量とメモリ使用量が増えるな(といっても微増だけど)
s(25,T,1,25):-T=<1.
s(25,T,2,50):-T=<2.
s(25,_,_,_):-!,fail.
s(N,T,1,N):-T=<1.
s(N,T,2,N2):-T=<2,N2 is N*2.
s(N,T,3,N3):-T=<3,N3 is N*3.
score(N):-between(1,20,N).
score(25):-!.
check(T,T,N,M):-M<N,!,fail.
check(_,_,_,_):-!.
calc2(N,_):-
score(M),
N+M*2<100.
calc2(N,T):-
score(M),
s(M,T,T2,M2),
check(T,T2,N,M2),
score(L),
L2 is L*2,
N+M2+L2<100.
calc1(1):-
score(_).
calc1(1):-
score(N),
s(N,1,T,N2),
calc2(N2,T).
main:-
findall(E,calc1(E),Es),
length(Es,Ans),
write(Ans).
最終更新:2015年01月28日 04:38