private int Solve(int itemNumbers, int capacity)
        {
            if (itemNumbers == 0 /*|| capacity <= 0*/) // stop if capacity is 0 supposes that there is no item with weight 0
            {
                return(0);
            }

            var key = new KnapSackKey(itemNumbers, capacity);

            if (Memoization.ContainsKey(key))
            {
                return(Memoization[key]);
            }

            var item     = Items[itemNumbers - 1];
            int takeItem = item.Weight <= capacity
                ? Solve(itemNumbers - 1, capacity - item.Weight) + item.Value
                : 0;

            int dropItem     = Solve(itemNumbers - 1, capacity);
            int greaterValue = Math.Max(takeItem, dropItem);

            Memoization[key] = greaterValue;

            return(greaterValue);
        }
Example #2
0
        public void MemoizeLast()
        {
            var calls = 0;
            var f     = Memoization.MemoizeLast(delegate(int i) { calls++; return(i * 2); });

            Assert.Equal(4, f(2));
            Assert.Equal(1, calls);
            Assert.Equal(4, f(2));
            Assert.Equal(1, calls);
            Assert.Equal(8, f(4));
            Assert.Equal(2, calls);
        }
Example #3
0
        public void MemoizeLastWithCustomComparer()
        {
            var calls    = 0;
            var comparer = StringComparer.OrdinalIgnoreCase;
            var f        = Memoization.MemoizeLast(delegate(string s) { calls++; return(s.ToUpperInvariant()); }, comparer);

            Assert.Equal("FOOBAR", f("foobar"));
            Assert.Equal(1, calls);
            Assert.Equal("FOOBAR", f("FOOBAR"));
            Assert.Equal(1, calls);
            Assert.Equal("FOOBAR", f("FoObAr"));
            Assert.Equal(1, calls);
        }
Example #4
0
        static void Main(string[] args)
        {
            //var input = new int[] { 0, 2, 3, 5, 7, 11 };
            //var input = new int[] { 1, 4, 6, 8, 9, 13, 18 };
            //var input = new int[] { 2, 5, 5, 2 };
            //var input = new int[] { 9, 4, 6, 20, 100, 15, 1 };
            //var input = new int[] { 100, 20, 15, 9, 4, 6, 1 };
            //var input = new int[] { 41, 72, 91, 50, 46, 68, 78, 99, 74, 89, 97, 84, 95, 41, 50 };

            //all datastructures can be called like this
            //var ds = new Graph<int>();
            //var arr = new DynamicArray<int>();

            //all algorithms can be called like this
            var result = Memoization.FibonacciMemoized(35);
        }
        public void Test2()
        {
            var counter = 0;
            var fib     = YCombinator <int> .Fix(f => x =>
            {
                counter++;
                return(x < 2 ? 1 : f(x - 1) + f(x - 2));
            });

            var m_fib = Memoization.Create(fib);

            counter = 0;
            m_fib(7);
            Assert.Equal(41, counter);

            counter = 0;
            m_fib(7);
            Assert.Equal(0, counter);
        }
Example #6
0
        public void MemoizeLastWithNullInputComparer()
        {
            var f = Memoization.MemoizeLast <object, object>(_ => null, null);

            Assert.Null(f(new object()));
        }
Example #7
0
        public void MemoizeLastThrowsWithNullFunction()
        {
            var e = Assert.Throws <ArgumentNullException>(() => Memoization.MemoizeLast <object, object>(null));

            Assert.Equal("function", e.ParamName);
        }
 public void Init()
 {
     sut   = new Recursion();
     sutMe = new Memoization();
 }