public int ComputeBounds(YedekCozum toCompute, ref YedekCozum best) { int i = toCompute.Index + 1; while (i < _items.Count && (toCompute.Agirlik + _items[i].Agirlik) <= _agirlikLimiti) { YedekCozum newSolution = new YedekCozum(_items, i, toCompute); toCompute = newSolution; i++; } if (toCompute.Deger > best.Deger) { best = toCompute; } if (i >= _items.Count || toCompute.Agirlik == _agirlikLimiti) { return(toCompute.Deger); } else { return((int)(((((long)(_agirlikLimiti - toCompute.Agirlik) * (_items[i].Deger)) - 1) / (_items[i].Agirlik)) + toCompute.Deger)); } }
public YedekCozum(List <SirtCantasiEsyasi> esyalar, int index, YedekCozum onceki) { if (index == -1) { _index = index; _deger = 0; _agirlik = 0; _onceki = null; } else { _index = index; _deger = onceki.Deger + esyalar[index].Deger; _agirlik = onceki.Agirlik + esyalar[index].Agirlik; _onceki = onceki; } }
public void Solve(string filename) { _agirlikLimiti = ReadInput(filename); YedekCozum candidate = new YedekCozum(_items, -1, null); YedekCozum best = candidate; OncelikSirasi <int, YedekCozum> queue = new OncelikSirasi <int, YedekCozum>(); queue.Add(candidate, ComputeBounds(candidate, ref best)); while (queue.Count > 0 && queue.YuksekOncelik >= best.Deger) { YedekCozum root = queue.RemoveYuksekOncelik(); int k = root.Index + 1; for (int j = k; j < _items.Count; j++) { YedekCozum child = new YedekCozum(_items, j, root); if (child.Agirlik <= _agirlikLimiti) { int childBounds = ComputeBounds(child, ref best); if (childBounds > best.Deger) { queue.Add(child, childBounds); } } } } _toplamDeger = best.Deger; _toplamAgirlik = best.Agirlik; while (best.Onceki != null) { SirtCantasiEsyasi tmp = _items[best.Index]; tmp.SelectionText = "X"; _items[best.Index] = tmp; best = best.Onceki; } }