このディレクトリの索引

#  個数制限つき部分和問題
#  n種類の数aiがそれぞれmi個ずつあります。
#  これらの中からいくつか選び、その総和がちょうどすることができるか
#  判定しなさい。

'n種類の数aiがそれぞれmi個ずつあります。これらの中からいくつか選び、その総和がちょうどすることができるか判定しなさい'(_n,_ai,_mi,K) :-
        ならびに展開する(_n,_ai,_mi,L),
        和がKとなる部分和を求める(1,_n,K,L).

和がKとなる部分和を求める(M,_n,K,L) :- M > _n,!,fail.
和がKとなる部分和を求める(M,_n,K,L) :-
        組合せ(L,M,L1),
        sum(L1,K),!.
和がKとなる部分和を求める(M,_n,K,L) :-
        M2 is M + 1,
        和がKとなる部分和を求める(M2,_n,K,L).

ならびに展開する([],[]) :- !.
ならびに展開する([A|R1],[B|R2],L) :-
        length(L1,B),
        all(L1,A),
        ならびに展開する(R1,R2,L2),
        append(L1,L2,L).