def sum(list)
a = 0
list.each { |i| a += i }
return a
end
def listup(a, limit_value)
ans = []
first = a[0]
# 要素がひとつだったら、限界値を超えていなければ、解として採用
if a.size == 1 then
if first <= limit_value then
ans = [[ first ]]
end
# 要素が複数
else
# 先頭の値が限界値以下なら、それを除いたリストに対して、
# 「限界値-先頭の値」を限界値として、探索
b = []
if first <= limit_value then
sub = listup(a[1..a.size-1], limit_value - first)
if sub.empty? then
b = [[ first ]]
else
b = sub.collect { |item| [ first ] + item }
end
end
# 先頭の値を除いたリストに対して探索
c = listup(a[1..a.size-1], limit_value)
# ふたつをマージ
b = b + c
# 候補の中から、合計値が一番大きいものを解として採用
v_max = 0
b.each { |item|
v = sum(item)
if v_max < v then
ans = [ item ]
v_max = v
elsif v_max == v then
ans.push item
end
}
end
return ans
end
def test(a, limit)
puts "** [#{a.join(',')}] <= #{limit}"
listup(a, limit).each_with_index { |d, idx|
puts "#{idx + 1} : [#{d.join(',')}]"
}
puts "-----------"
end
test([6,10,100,8,4], 111)
test([1, 2, 3, 4, 5], 5)
test([1, 2, 3, 4, 5], 4)
test([41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199], 195)
ZGVmIHN1bShsaXN0KQoJYSA9IDAKCWxpc3QuZWFjaCB7IHxpfCBhICs9IGkgfQoJcmV0dXJuIGEKZW5kCgpkZWYgbGlzdHVwKGEsIGxpbWl0X3ZhbHVlKQoJYW5zID0gW10KCWZpcnN0ID0gYVswXQoKCSMg6KaB57Sg44GM44Gy44Go44Gk44Gg44Gj44Gf44KJ44CB6ZmQ55WM5YCk44KS6LaF44GI44Gm44GE44Gq44GR44KM44Gw44CB6Kej44Go44GX44Gm5o6h55SoCglpZiBhLnNpemUgPT0gMSB0aGVuCgkJaWYgZmlyc3QgPD0gbGltaXRfdmFsdWUgdGhlbgoJCQlhbnMgPSBbWyBmaXJzdCBdXQoJCWVuZAoKCSMg6KaB57Sg44GM6KSH5pWwCgllbHNlCgkJIyDlhYjpoK3jga7lgKTjgYzpmZDnlYzlgKTku6XkuIvjgarjgonjgIHjgZ3jgozjgpLpmaTjgYTjgZ/jg6rjgrnjg4jjgavlr77jgZfjgabjgIEKCQkjIOOAjOmZkOeVjOWApO+8jeWFiOmgreOBruWApOOAjeOCkumZkOeVjOWApOOBqOOBl+OBpuOAgeaOoue0ogoJCWIgPSBbXQoJCWlmIGZpcnN0IDw9IGxpbWl0X3ZhbHVlIHRoZW4KCQkJc3ViID0gbGlzdHVwKGFbMS4uYS5zaXplLTFdLCBsaW1pdF92YWx1ZSAtIGZpcnN0KQoJCQlpZiBzdWIuZW1wdHk/IHRoZW4KCQkJCWIgPSBbWyBmaXJzdCBdXQoJCQllbHNlCgkJCQliID0gIHN1Yi5jb2xsZWN0IHsgfGl0ZW18IFsgZmlyc3QgXSArIGl0ZW0gfQoJCQllbmQKCQllbmQKCgkJIyDlhYjpoK3jga7lgKTjgpLpmaTjgYTjgZ/jg6rjgrnjg4jjgavlr77jgZfjgabmjqLntKIKCQljID0gbGlzdHVwKGFbMS4uYS5zaXplLTFdLCBsaW1pdF92YWx1ZSkKCgkJIyDjgbXjgZ/jgaTjgpLjg57jg7zjgrgKCQliID0gYiArIGMKCgkJIyDlgJnoo5zjga7kuK3jgYvjgonjgIHlkIjoqIjlgKTjgYzkuIDnlarlpKfjgY3jgYTjgoLjga7jgpLop6PjgajjgZfjgabmjqHnlKgKCQl2X21heCA9IDAKCQliLmVhY2ggeyB8aXRlbXwKCQkJdiA9IHN1bShpdGVtKQoJCQlpZiB2X21heCA8IHYgdGhlbgoJCQkJYW5zID0gWyBpdGVtIF0KCQkJCXZfbWF4ID0gdgoJCQllbHNpZiB2X21heCA9PSB2IHRoZW4KCQkJCWFucy5wdXNoIGl0ZW0KCQkJZW5kCgkJfQoJZW5kCgoJcmV0dXJuIGFucwplbmQKCgoKCmRlZiB0ZXN0KGEsIGxpbWl0KQoJcHV0cyAiKiogWyN7YS5qb2luKCcsJyl9XSA8PSAje2xpbWl0fSIKCWxpc3R1cChhLCBsaW1pdCkuZWFjaF93aXRoX2luZGV4IHsgfGQsIGlkeHwKCQlwdXRzICIje2lkeCArIDF9IDogWyN7ZC5qb2luKCcsJyl9XSIKCX0KCXB1dHMgIi0tLS0tLS0tLS0tIgplbmQKCnRlc3QoWzYsMTAsMTAwLDgsNF0sIDExMSkKdGVzdChbMSwgMiwgMywgNCwgNV0sIDUpCnRlc3QoWzEsIDIsIDMsIDQsIDVdLCA0KQp0ZXN0KFs0MSw0Myw0Nyw1Myw1OSw2MSw2Nyw3MSw3Myw3OSw4Myw4OSw5NywxMDEsMTAzLDEwNywxMDksMTEzLDEyNywxMzEsMTM3LDEzOSwxNDksMTUxLDE1NywxNjMsMTY3LDE3MywxNzksMTgxLDE5MSwxOTMsMTk3LDE5OV0sIDE5NSkK
** [6,10,100,8,4] <= 111
1 : [6,100,4]
2 : [10,100]
-----------
** [1,2,3,4,5] <= 5
1 : [1,4]
2 : [2,3]
3 : [5]
-----------
** [1,2,3,4,5] <= 4
1 : [1,3]
2 : [4]
-----------
** [41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199] <= 195
1 : [41,47,107]
2 : [41,53,101]
3 : [41,71,83]
4 : [43,73,79]
5 : [47,59,89]
6 : [53,59,83]
-----------