Advertisement
stanevplamen

02.01.16.SubsetSumsDP

Jul 19th, 2013
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.02 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. public static class SubsetSums
  5. {
  6.     static int offset;
  7.     public static int[] possible;
  8.     static void Main()
  9.     {
  10.         int[] numbs = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -600 };
  11.         int N = numbs.Length;
  12.         offset = 100000;
  13.         int minPos = numbs[0];
  14.         int maxPos = numbs[0];
  15.         possible = new int[offset + offset];
  16.         for (int i = 0; i < N; i++)
  17.         {
  18.             int newMinPos = minPos;
  19.             int newMaxPos = maxPos;
  20.             int[] newPossible = new int[possible.Length];
  21.             for (int j = maxPos; j >= minPos; j--)
  22.             {
  23.                 if (possible[j + offset] >= 1)
  24.                 {
  25.                     newPossible[j + numbs[i] + offset]++;
  26.                 }
  27.                 if (j + numbs[i] > newMaxPos)
  28.                 {
  29.                     newMaxPos = j + numbs[i];
  30.                 }
  31.                 if (j + numbs[i] < newMinPos)
  32.                 {
  33.                     newMinPos = j + numbs[i];
  34.                 }
  35.             }
  36.             minPos = newMinPos;
  37.             maxPos = newMaxPos;
  38.             for (int j = maxPos; j >= minPos; j--)
  39.             {
  40.                 if (newPossible[j + offset] >= 1)
  41.                 {
  42.                     possible[j + offset] = possible[j + offset] + newPossible[j + offset];
  43.                 }
  44.             }
  45.  
  46.             if (numbs[i] > maxPos)
  47.             {
  48.                 maxPos = numbs[i];
  49.             }
  50.             if (numbs[i] < minPos)
  51.             {
  52.                 minPos = numbs[i];
  53.             }
  54.             possible[numbs[i] + offset]++;
  55.         }
  56.  
  57.  
  58.         Console.Write("All array elements: ");
  59.         for (int i = 0; i < N; i++)
  60.         {
  61.             Console.Write("{0} ", numbs[i]);
  62.         }
  63.         Console.WriteLine("\n");
  64.  
  65.         int firstCheckedSum = -655;
  66.         CheckCurrentSum(possible, firstCheckedSum);    
  67.         int secondCheckedSum = -700;
  68.         CheckCurrentSum(possible, secondCheckedSum);
  69.         int thirdCheckedSum = 0;
  70.         CheckCurrentSum(possible, thirdCheckedSum);
  71.         int fourthCheckedSum = 55;
  72.         CheckCurrentSum(possible, fourthCheckedSum);
  73.         int fifthCheckedSum = 210;
  74.         CheckCurrentSum(possible, fifthCheckedSum);
  75.  
  76.         //// Uncoment for all possible sums
  77.         //Console.WriteLine("All possible sums:");
  78.         //for (int i = minPos; i <= maxPos; i++)
  79.         //{
  80.         //    if (possible[i + offset] >= 1)
  81.         //    {
  82.         //        Console.Write("Possible sum {0,-8}", i);
  83.         //    }
  84.         //}
  85.     }
  86.  
  87.     private static void CheckCurrentSum(int[] possible, int currentCheckedSum)
  88.     {
  89.         if (possible[currentCheckedSum + offset] != 0)
  90.         {
  91.             Console.WriteLine("The sum {0} is possible", currentCheckedSum);
  92.         }
  93.         else
  94.         {
  95.             Console.WriteLine("The sum {0} is not possible", currentCheckedSum);
  96.         }
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement