Fortran - комбинации шаров
И снова вопрос по комбинаторике. Пусть у меня есть шары трех цветов: красные, синие и зеленые. Красный шар имеет вес 200 грамм, синий - 150 грамм, а зеленый 50 грамм. Все шары различимы. Нужно взять шары таким образом, чтобы общая масса не превышала 500 грамм. Например:
1 красный, 0 синих, 0 зеленых
2 красных, 0 синих, 0 зеленых
1 красный, 1 синий, 0 зеленых
1 красный, 2 синих, 0 зеленых
1 красный, 0 синих, 1 зеленый
и так далее.
Подскажите, пожалуйста, как найти все такие комбинации с использованием Фортрана. Что-то похожее получится при использовании кода (если число шаров соответственно 2, 3 и 10):
B=500
A=/200,150,50/
do a1=1,2
do a2=1,3
do a3=1,10
if B>=a1*A(1)+a2*A(2)+a3*A(3) print *, a1,A(1),a2,A(2),a3,A(3)
end do
end do
end do
Проблема моя более общая, если будет не 3 вида шаров, а 50, 100, 1000. Как можно перебрать такие комбинации, используя более экономичную процедуру? Направьте, пожалуйста, на истинный путь. Может, можно как-нибудь рекурсией или бинарным деревом?
Источник: Stack Overflow на русском