Advertisement
Guest User

Untitled

a guest
Jul 19th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <tdzdd/DdSpec.hpp>
  4. #include <tdzdd/DdStructure.hpp>
  5.  
  6. using namespace std;
  7.  
  8. class KnapsackZdd : public tdzdd::DdSpec<KnapsackZdd, int, 2> {
  9. int const n;
  10. int const *w;
  11. int const W;
  12. public:
  13. KnapsackZdd (int n, int *w, int W) : n(n), w(w), W(W) { }
  14.  
  15. int getRoot(int& state) {
  16. state = 0;
  17. return n;
  18. }
  19.  
  20. int getChild(int& state, int level, int value) const {
  21. if (value == 1)
  22. state += w[n - level];
  23. level--;
  24. if (state > W)
  25. return 0;
  26. if (level == 0)
  27. return -1;
  28. return level;
  29. }
  30. };
  31.  
  32. class MaxElement : public tdzdd::DdEval<MaxElement,int> {
  33. int const n;
  34. int const *c;
  35. public:
  36. MaxElement(int n, int *c) : n(n), c(c) { }
  37. void evalTerminal(int& val, bool one) const {
  38. val = one ? 0 : INT_MIN;
  39. }
  40. void evalNode(int& val, int level, tdzdd::DdValues<int,2> const& values) const {
  41. val= std::max(values.get(0), values.get(1) + c[n - level]);
  42. }
  43. };
  44.  
  45. int main() {
  46. const int n = 5, W = 10;
  47. int w[] = {4, 4, 10, 3, 5};
  48. int c[] = {5, 8, 3, 4, 6};
  49.  
  50. KnapsackZdd knapsack(n, w, W);
  51. tdzdd::DdStructure<2> dd(knapsack);
  52. ofstream output("knapsack.dot");
  53. dd.dumpDot(output);
  54.  
  55. // evaluate max answer
  56. cout << "max val = " << dd.evaluate(MaxElement(n, c)) << endl;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement