Prolog 在列表中查找所有元素的组合,这些元素的总和为一个值
假设我有一个随机长度的列表,比如:Prolog 在列表中查找所有元素的组合,这些元素的总和为一个值,prolog,Prolog,假设我有一个随机长度的列表,比如: L = [190, 20, 80, 200, 10]. 有没有办法在输出列表中获得所有可能的元素组合,使它们的总和小于或等于给定值 例如,查找元素(MaxValue、InputList、OutputList) MaxValue=200的可能解决方案: OutputList = [190, 10] OutputList = [200] OuputList = [20, 80, 10] 到目前为止,我的代码如下所示: solutions(_, [], [],
L = [190, 20, 80, 200, 10].
有没有办法在输出列表中获得所有可能的元素组合,使它们的总和小于或等于给定值
例如,查找元素(MaxValue、InputList、OutputList)
MaxValue=200的可能解决方案:
OutputList = [190, 10]
OutputList = [200]
OuputList = [20, 80, 10]
到目前为止,我的代码如下所示:
solutions(_, [], [], _).
solutions(MaxValue, [H|T], OutputList, Acc):-
Z is H + Acc,
Z > MaxValue,
solutions(MaxValue, T, OutputList, Acc), !.
solutions(MaxValue, [H|T], [H|T2], Acc):-
Z is H + Acc,
Z =< MaxValue,
solutions(MaxValue, T, T2, Z).
solutions(MaxValue, Inputlist, OutputList):-
solutions(MaxValue, Inputlist, OutputList, 0).
但是X=[3,4180]
也是正确的,而且X=[180,10]
也是正确的。我想把它们都作为解决方案
提前谢谢 一个快速的实现可以是:
subset([], []).
subset([H|T], [H|T1]):-
subset(T,T1).
subset([_|T],T1):-
subset(T, T1).
solve(MaxVal,Lin,Lout):-
subset(Lin,Lout),
sumlist(Lout,Val),
Val < MaxVal.
因此,您只需找到所有子集,然后检查列表的总和是否小于值
MaxVal
是的,这是可能的。到目前为止,您尝试了什么?我尝试使用累加器变量递归遍历列表,该变量从左到右累加元素,但这不是我想要的。如果我使用MaxValue=200,我将得到OutputList=[190]。但也有其他元素组合可以满足这一要求,例如OutputList=[20,80,10]。编辑您的问题,并显示您的编码尝试以及您遇到的问题。我已更新了问题并添加了代码。非常感谢。您可能需要调整它,因为这将为您提供所有组合的所有顺序;)
subset([], []).
subset([H|T], [H|T1]):-
subset(T,T1).
subset([_|T],T1):-
subset(T, T1).
solve(MaxVal,Lin,Lout):-
subset(Lin,Lout),
sumlist(Lout,Val),
Val < MaxVal.
?- solve(200,[190, 20, 80, 200, 10],L).
L = [190]
L = [20, 80, 10]
L = [20, 80]
L = [20, 10]
L = [20]
L = [80, 10]
L = [80]
L = [10]
L = []