このディレクトリの索引

http://hibari.2ch.net/test/read.cgi/tech/1276873238/514
# 100、200、250、300、350、500、
# 550、600、700、1,000、1,200、
# 1,500、2,500、3,000円の商品を
# 売っている店がある。
# x円でお釣りが最も少なくなるよう買うには
# どう買えば良いか?
#
# 例: 手持ち8,520円の場合
# 3,000円の商品を2個=6,000円
# 2,500円の商品を1個=2,500円
# と買えば合計8,500円、釣り20円

'x円で残高が最も少なくなるよう買うにはどう買えば良いか?'(_手持ち金,_最小残高,_その時の内訳) :-
        findall([_残高,[N_1,N_2,N_3,N_4,N_5,N_6,N_7,N_8,N_9,N_10,N_11,N_12,N_13,N_14]],
                    'x円で残高が最も少なくなるよう買うにはどう買えば良いか?'(_手持ち金,[N_1,N_2,N_3,N_4,N_5,N_6,N_7,N_8,N_9,N_10,N_11,N_12,N_13,N_14],_残高),
                L),
        最小残高とその時の内訳ならびを得る(L,_手持ち金,[],_最小残高,_その時の内訳ならび),
        append(_,[_その時の内訳|_],_その時の内訳ならび),
        最小残高になるときの買う商品の内訳を表示する(_その時の内訳,[100,200,250,300,350,500,550,600,700,1000,1200,1500,2500,3000]),
        write_formatted('と買えば合計%t円、 残高%t円\n',[_合計,_最小残高]).

'x円で残高が最も少なくなるよう買うにはどう買えば良いか?'(_手持ち金,[N_1,N_2,N_3,N_4,N_5,N_6,N_7,N_8,N_9,N_10,N_11,N_12,N_13,N_14],_残高) :-
        '_商品金額の商品を手持ち金までN個買う'(0,100,_手持ち金,N_1,_この商品への投資額_1),
        '_商品金額の商品を手持ち金までN個買う'(0,200,_手持ち金,N_2,_この商品への投資額_2),
        '_商品金額の商品を手持ち金までN個買う'(0,250,_手持ち金,N_3,_この商品への投資額_3),
        '_商品金額の商品を手持ち金までN個買う'(0,300,_手持ち金,N_4,_この商品への投資額_4),
        '_商品金額の商品を手持ち金までN個買う'(0,350,_手持ち金,N_5,_この商品への投資額_5),
        '_商品金額の商品を手持ち金までN個買う'(0,500,_手持ち金,N_6,_この商品への投資額_6),
        '_商品金額の商品を手持ち金までN個買う'(0,550,_手持ち金,N_7,_この商品への投資額_7),
        '_商品金額の商品を手持ち金までN個買う'(0,600,_手持ち金,N_8,_この商品への投資額_8),
        '_商品金額の商品を手持ち金までN個買う'(0,700,_手持ち金,N_9,_この商品への投資額_9),
        '_商品金額の商品を手持ち金までN個買う'(0,1000,_手持ち金,N_10,_この商品への投資額_10),
        '_商品金額の商品を手持ち金までN個買う'(0,1200,_手持ち金,N_11,_この商品への投資額_11),
        '_商品金額の商品を手持ち金までN個買う'(0,1500,_手持ち金,N_12,_この商品への投資額_12),
        '_商品金額の商品を手持ち金までN個買う'(0,2500,_手持ち金,N_13,_この商品への投資額_13),
        '_商品金額の商品を手持ち金までN個買う'(0,3000,_手持ち金,N_14,_この商品への投資額_14),
        _商品合計 is _この商品への投資額_1 + _この商品への投資額_2 + _この商品への投資額_3 + _この商品への投資額_4 + _この商品への投資額_5 + _この商品への投資額_6 + _この商品への投資額_7 + _この商品への投資額_8 + _この商品への投資額_9 + _この商品への投資額_10 + _この商品への投資額_11 + _この商品への投資額_12 + _この商品への投資額_13 + _この商品への投資額_14,
        _手持ち金 >= _商品合計,
        _残高 is _手持ち金 - _商品合計.

'_商品金額の商品を手持ち金までN個買う'(N,_商品金額,_手持ち金,N,_この商品への投資額) :-
        _この商品への投資額 is _商品金額 * N,
        _この商品への投資額 =< _手持ち金.
'_商品金額の商品を手持ち金までN個買う'(N1,_商品金額,_手持ち金,N,_この商品への投資額) :-
        _この商品への投資額 is _商品金額 * N1,
        _この商品への投資額 =< _手持ち金.
        N2 is N1 + 1,
        '_商品金額の商品を手持ち金までN個買う'(N2,_商品金額,_手持ち金,N,_この商品への投資額).

最小残高になるときの買う商品の内訳を表示する([],_) :- !.
最小残高になるときの買う商品の内訳を表示する([0|R1],[_|R2]) :-
        最小残高になるときの買う商品の内訳を表示する(R1,R2).
最小残高になるときの買う商品の内訳を表示する([N|R1],[_商品金額|R2]) :-
        \+(N = 0),
        _この商品への投資額 is _商品金額 * N,
        write_formatted('%t円の商品を%t個=%t円\n',[_商品金額,N,_この商品への投資額]),
        最小残高になるときの買う商品の内訳を表示する(R1,R2).

最小残高とその時の内訳ならびを得る([],_最小残高,_その時の内訳ならび,_最小残高,_その時の内訳ならび) :- !.
最小残高とその時の内訳ならびを得る([[_残高,_その時の内訳]|R1],_最小残高1,L1,_最小残高,L) :-
        _残高=_最小残高1,
       最小残高とその時の内訳ならびを得る(R1,_最小残高1,[_その時の内訳|L1],_最小残高,L),!.
最小残高とその時の内訳ならびを得る([[_残高,_その時の内訳]|R1],_最小残高1,L1,_最小残高,L) :-
        _残高<_最小残高1,
       最小残高とその時の内訳ならびを得る(R1,_残高,[_その時の内訳],_最小残高,L),!.
最小残高とその時の内訳ならびを得る([[_残高,_]|R1],_最小残高1,L1,_最小残高,L) :-
        _残高<_最小残高1,
       最小残高とその時の内訳ならびを得る(R1,_最小残高1,L1,_最小残高,L),!.