예제 #1
0
        private void ApplyTest(int[] set, int sum, List <List <int> > expected)
        {
            SubsetSum          calculator = new SubsetSum(sum, set);
            List <List <int> > result     = calculator.GetResult();

            Assert.IsTrue(TestHelpers.Are2DListsEqual(expected, result));
        }
예제 #2
0
        public void RunTest()
        {
            var values = new List <int>
            {
                8, 8, 8, 8, 8, 8, 8, 8,
                10, 10, 10, 10, 10, 10,
                12, 12, 12, 12, 12,
                16, 16, 16, 16,
                20, 20, 20
            };

            var sum = 68;

            var actual = SubsetSum.Run(values, sum);

            var expectedCount = 32;

            Assert.Equal(expectedCount, actual.Count());

            _output.WriteLine($"Count: {actual.Count()}");
            foreach (var solution in actual)
            {
                _output.WriteLine(string.Join(" ", solution));
            }
        }
예제 #3
0
        public IEnumerable <ConnectorsCombinationModel> GetMinimalAmountOfConnectorsForMaxCurrentInAmps(int maxCurrentInAmps)
        {
            if (maxCurrentInAmps > CapacityInAmps || ChargeStations?.Any() == false)
            {
                return(Enumerable.Empty <ConnectorsCombinationModel>());
            }

            var flatData =
                ChargeStations
                .SelectMany(x => x.Connectors, (chargeStation, connector) => new ConnectorModel
            {
                ChargeStationId  = chargeStation.Id,
                ConnectorId      = connector.Id,
                MaxCurrentInAmps = connector.MaxCurrentInAmps
            });

            var subsets = SubsetSum.Solve(flatData, maxCurrentInAmps);

            var result = subsets.Select(x => new ConnectorsCombinationModel
            {
                Connectors         = x,
                MaxCurrentInAmps   = x.Sum(y => y.MaxCurrentInAmps),
                NumberOfConnectors = x.Count()
            });

            return(result);
        }
예제 #4
0
        //public static void Main(string[] args)
        //{
        //    SemiPerfect semiPerfect = new SemiPerfect();

        //    bool sp1 = semiPerfect.IsSemiperfect(40);       //true;
        //    bool sp2 = semiPerfect.IsSemiperfect(70);       //false;
        //}

        public bool IsSemiperfect(int n)
        {
            int[] divisors = GetDivisors(n);

            SubsetSum subsetSum = new SubsetSum();

            // Call the problem array has subset with sum = given sum.
            return(subsetSum.IsSubsetWithGivenSumExists(divisors, n));
        }
예제 #5
0
    static void Main(string[] args)
    {
        List <int> testList = new List <int>();

        for (int i = 1; i <= 1000; ++i)
        {
            testList.Add(1);
        }

        Console.WriteLine(SubsetSum.Find(testList, 0, 1000));
        Console.WriteLine(SubsetSum.Find(new List <int>()
        {
            1, 2, 3, 4, 5, 6
        }, 0, 21));
    }
예제 #6
0
    static void Main(string[] args)
    {
        List <int> testList = new List <int>();

        for (int i = 0; i < 1000; ++i)
        {
            testList.Add(1);
        }

        Console.WriteLine(SubsetSum.Find(testList, 1000));

        foreach (int index in SubsetSum.GetLastResult(1000))
        {
            Console.WriteLine(index);
        }
    }
    public void ValidateAlgo(int[] nums, int sum, bool expected){
        var subsetSum = new SubsetSum();
        Assert.Equal(expected, subsetSum.TopDownSubSetSum(nums, sum));

    }
    public override void Execute(BaseGrid grid, ArchitectureStyle[] allArchitectureStyles, int[] architectureStylesMap, List <Block> blocks)
    {
        _allotments = new List <Allotment> ();
        foreach (Block block in blocks)
        {
            ArchitectureStyle architectureStyle = block.randomArchitectureStyle;

            int blockWidthInTiles = block.width / architectureStyle.tileWidth;
            int blockDepthInTiles = block.depth / architectureStyle.tileWidth;

            int[][] possibleWidths = SubsetSum.Combinations(Enumerable.Range(architectureStyle.minWidth + architectureStyle.spacing, architectureStyle.maxWidth + architectureStyle.spacing).ToArray(), blockWidthInTiles);
            int[][] possibleDepths = SubsetSum.Combinations(Enumerable.Range(architectureStyle.minDepth + architectureStyle.spacing, architectureStyle.maxDepth + architectureStyle.spacing).ToArray(), blockDepthInTiles);

            int[] widths = possibleWidths [UnityEngine.Random.Range(0, possibleWidths.Length)];
            int[] depths = possibleDepths [UnityEngine.Random.Range(0, possibleDepths.Length)];

            int startX = (int)block.center.x - block.width / 2;
            int startZ = (int)block.center.y - block.depth / 2;

            int zOffset = 0;
            for (int z2 = 0; z2 < depths.Length; z2++)
            {
                int xOffset      = 0;
                int depthInTiles = depths [z2];
                int depth        = depthInTiles * architectureStyle.tileWidth;
                for (int x2 = 0; x2 < widths.Length; x2++)
                {
                    int widthInTiles = widths [x2];
                    int width        = widthInTiles * architectureStyle.tileWidth;

                    if ((z2 == 0 || z2 == depths.Length - 1) || (x2 == 0 || x2 == widths.Length - 1))
                    {
                        HashSet <Direction> freeFaces = new HashSet <Direction> ();

                        if (z2 == 0)
                        {
                            freeFaces.Add(Direction.FRONT);
                        }
                        else if (z2 == depths.Length - 1)
                        {
                            freeFaces.Add(Direction.BACK);
                        }

                        if (x2 == 0)
                        {
                            freeFaces.Add(Direction.LEFT);
                        }
                        else if (x2 == widths.Length - 1)
                        {
                            freeFaces.Add(Direction.RIGHT);
                        }

                        _allotments.Add(new Allotment(startX + xOffset, startZ + zOffset, width, depth, widthInTiles, depthInTiles, freeFaces.ToArray(), architectureStyle));
                    }

                    xOffset += width;
                }
                zOffset += depth;
            }
        }
    }