Advertisement
theo830

μονευ

May 18th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.74 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<stdio.h>
  5. using namespace std;
  6. long long y=0;
  7. vector<long long> q;
  8. bool printknapSack(long long W, long long val[], long long n,long long y){
  9. long long i, w;
  10. long long x=0;
  11. long long K[n + 1][W + 1];
  12. for (i = 0; i <= n; i++) {
  13. for (w = 0; w <= W; w++) {
  14. if (i == 0 || w == 0){
  15. K[i][w] = 0;
  16. }
  17.  
  18. else if (val[i - 1] <= w){
  19. K[i][w] = max(val[i - 1] +K[i - 1][w - val[i - 1]], K[i - 1][w]);
  20. }
  21. else{
  22. K[i][w] = K[i - 1][w];
  23. }
  24. }
  25. }
  26. if(K[n][W] == W){
  27. int res = K[n][W];
  28. w = W;
  29. for (i = n; i > 0 && res > 0; i--) {
  30. if (res == K[i - 1][w])
  31. continue;
  32. else {
  33. q.push_back(val[i-1]);
  34. res = res - val[i - 1];
  35. w = w - val[i - 1];
  36. }
  37. }
  38. return true;
  39. }
  40. else if(W == 0){
  41. return true;
  42. }
  43. else{
  44. return false;
  45. }
  46. }
  47. int main(){
  48. ios_base::sync_with_stdio(false);
  49. cin.tie(0);
  50. cout.tie(0);
  51. long long n;
  52. scanf("%lld",&n);
  53. long long val[n];
  54. long long x;
  55. vector<long long>k;
  56. vector<long long>q1;
  57. long long temp;
  58. for(long long i=0;i<n;i++){
  59. scanf("%lld",&val[i]);
  60. y+=val[i];
  61. }
  62. int tr;
  63. tr = y/2;
  64. bool b=true;
  65. while(tr > 0){
  66. temp = y - (2 * tr);
  67. b = printknapSack(temp,val,n,y);
  68. if(b == true){
  69. if(temp != 0){
  70. while(!q.empty()){
  71. for(int i=0;i<n;i++){
  72. if(val[i] == q.back()){
  73. val[i] = 0;
  74. k.push_back(i);
  75. q1.push_back(q.back());
  76. q.pop_back();
  77. break;
  78. }
  79. }
  80. }
  81. }
  82. b = printknapSack(tr,val,n,y);
  83. if(temp != 0){
  84. while(!k.empty()){
  85. val[k.back()] = q1.back();
  86. k.pop_back();
  87. q1.pop_back();
  88. }
  89. }
  90. if(b == 1){
  91. break;
  92. }
  93. tr--;
  94. }
  95. else{
  96. tr--;
  97. }
  98. }
  99. if(tr == 0){
  100. printf("%lld",y);
  101. }
  102. else{
  103. printf("%lld",tr+temp);
  104. }
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement