To jest moje wejście z ustawieniem wstępnym target
dla wszystkich zasobów i value
dla każdego zasobu, a lista jednej początkowej kombinacji (res
, rozmiar res
może być dowolna). Tak więc końcowym wynikiem powinny być wielokrotne kombinacje zasobów, aby osiągnąć cel, ale suma wartości nie powinna przekraczać celu, ale powinna być najbliżej celu (pokazana w res1
, res2
.... resN itp.)Wiele kombinacji wartości na liście w oparciu o cel i liczba
case class Container(name:String,count:Long,value:Double)
val target = 742.0
val value = 250.0
val a = Container(Resource1, 1 , 250.0)
val b = Container(Resource2, 2 , 125.0)
val c = Container(Resource3, 3 , 83.33)
val d = Container(Resource4, 1 , 250.0)
val res = List(a,b,c,d)
val a1 = Container(Resource1, 2 , 125.0)
val b2 = Container(Resource2, 1 , 250.0)
val c3 = Container(Resource3, 3 , 83.33)
val d4 = Container(Resource4, 1 , 250.0)
val res1 = List(a1,b2,c3,d4)
val a5 = Container(Resource1, 2 , 125.0)
val b6 = Container(Resource2, 1 , 250.0)
val c7 = Container(Resource3, 1 , 250.0)
val d8 = Container(Resource4, 3 , 83.33)
val res2 = List(a5,b6,c7,d8)
Próbowałem tak, ale otrzymałem tylko jedną kombinację, proszę, pomóżcie w rozwiązaniu tego problemu.
var tar: Double = target
val listBuffer = ListBuffer[Container]()
def doRecursion(r: String, value: Double, count: Int = 1): List[Container] = {
if (value < tar) {
tar = tar - value
listBuffer += Container(r, count, value/count)
listBuffer.toList
} else {
if (listBuffer.toList.nonEmpty) {
val last = listBuffer.toList.last
listBuffer -= last
listBuffer += last.copy(count = last.count + 1, time = (last.time * last.count)/(last.count + 1))
tar = target - (listBuffer.toList.map(_.time).sum)
doRecursion(r, value)
}
else {
doRecursion(r, value/2, count + 1)
}
}
}
Jeśli dobrze rozumiem, chcesz wziąć listę kontenerów i upewnić się, że suma wartości każdego 'Container' na liście nie przekracza wartości' target'? Czy musisz podzielić wartość przez 2 lub po prostu odjąć nadmiar? –
@RobertUdah .... poprawny, ale jeśli to przekracza, muszę zwiększyć liczbę i dostosować. – Jet
Jeśli moja odpowiedź rozwiąże problem, czy myślisz o zaznaczeniu go jako zaakceptowanej odpowiedzi? –