Ide:
Imports System
Imports System.Collections.Generic
Imports System.Linq
Namespace E
Public Class Optimizer
Public Structure Result
Public Value As Double
Public NoBuckets As Integer
Public Buckets As Integer()
End Structure
Private Shared Sub BruteForce(targetval As Double, bucketvals As List(Of Double), ix As Integer, len As Integer, work As Integer(), ByRef res As Result)
For i As Integer = ix To bucketvals.Count - 1
work(len) = i
len += 1
Dim val As Double = work.Take(len).Sum(Function(v) bucketvals(v))
If val < targetval Then
If i < bucketvals.Count - 1 Then
BruteForce(targetval, bucketvals, i + 1, len, work, res)
End If
Else
If val < res.Value Then
res.Value = val
res.NoBuckets = len
res.Buckets = DirectCast(work.Clone(), Integer())
End If
End If
len -= 1
Next
End Sub
Public Shared Function BruteForce(targetval As Double, bucketvals As List(Of Double)) As Result
Dim res As New Result()
res.Value = Double.MaxValue
res.NoBuckets = 0
res.Buckets = New Integer(bucketvals.Count - 1) {}
BruteForce(targetval, bucketvals, 0, 0, New Integer(bucketvals.Count - 1) {}, res)
Return res
End Function
End Class
Public Class Program
Private Shared Sub Test(targetval As Double, bucketvals As List(Of Double))
Dim res As Optimizer.Result = Optimizer.BruteForce(targetval, bucketvals)
Console.WriteLine("{0} : {1}", res.Value, [String].Join(",", res.Buckets.Take(res.NoBuckets).Select(Function(v) v.ToString()).ToArray()))
End Sub
Public Shared Sub Main(args As String())
Dim a As New List(Of Double)() From { 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9 }
Test(5.0, a)
Test(5.1, a)
Test(5.2, a)
Test(5.3, a)
Test(5.325, a)
Test(5.35, a)
Test(5.4, a)
Test(10.0, a)
Console.ReadKey()
End Sub
End Class
End Namespace