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;
            }
        }