Guest User

Untitled

a guest
Mar 23rd, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. // C++ program to count all subsets with
  2. // given sum.
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. // dp[i][j] is going to store true if sum j is
  7. // possible with array elements from 0 to i.
  8. bool** dp;
  9.  
  10. void display(const vector<int>& v)
  11. {
  12. for (int i = 0; i < v.size(); ++i)
  13. printf("%d ", v[i]);
  14. printf("\n");
  15. }
  16.  
  17. // A recursive function to print all subsets with the
  18. // help of dp[][]. Vector p[] stores current subset.
  19. void printSubsetsRec(int arr[], int i, int sum, vector<int>& p)
  20. {
  21. // If we reached end and sum is non-zero. We print
  22. // p[] only if arr[0] is equal to sun OR dp[0][sum]
  23. // is true.
  24. if (i == 0 && sum != 0 && dp[0][sum])
  25. {
  26. p.push_back(arr[i]);
  27. display(p);
  28. return;
  29. }
  30.  
  31. // If sum becomes 0
  32. if (i == 0 && sum == 0)
  33. {
  34. display(p);
  35. return;
  36. }
  37.  
  38. // If given sum can be achieved after ignoring
  39. // current element.
  40. if (dp[i-1][sum])
  41. {
  42. // Create a new vector to store path
  43. vector<int> b = p;
  44. printSubsetsRec(arr, i-1, sum, b);
  45. }
  46.  
  47. // If given sum can be achieved after considering
  48. // current element.
  49. if (sum >= arr[i] && dp[i-1][sum-arr[i]])
  50. {
  51. p.push_back(arr[i]);
  52. printSubsetsRec(arr, i-1, sum-arr[i], p);
  53. }
  54. }
  55.  
  56. // Prints all subsets of arr[0..n-1] with sum 0.
  57. void printAllSubsets(int arr[], int n, int sum)
  58. {
  59. if (n == 0 || sum < 0)
  60. return;
  61.  
  62. // Sum 0 can always be achieved with 0 elements
  63. dp = new bool*[n];
  64. for (int i=0; i<n; ++i)
  65. {
  66. dp[i] = new bool[sum + 1];
  67. dp[i][0] = true;
  68. }
  69.  
  70. // Sum arr[0] can be achieved with single element
  71. if (arr[0] <= sum)
  72. dp[0][arr[0]] = true;
  73.  
  74. // Fill rest of the entries in dp[][]
  75. for (int i = 1; i < n; ++i)
  76. for (int j = 0; j < sum + 1; ++j)
  77. dp[i][j] = (arr[i] <= j) ? dp[i-1][j] ||
  78. dp[i-1][j-arr[i]]
  79. : dp[i - 1][j];
  80. if (dp[n-1][sum] == false)
  81. {
  82. printf("There are no subsets with sum %d\n", sum);
  83. return;
  84. }
  85.  
  86. // Now recursively traverse dp[][] to find all
  87. // paths from dp[n-1][sum]
  88. vector<int> p;
  89. printSubsetsRec(arr, n-1, sum, p);
  90. }
  91.  
  92. // Driver code
  93. int main()
  94. {
  95. int arr[] = {1, 2, 3, 4, 5};
  96. int n = sizeof(arr)/sizeof(arr[0]);
  97. int sum = 10;
  98. printAllSubsets(arr, n, sum);
  99. return 0;
  100. }
Add Comment
Please, Sign In to add comment