knightL

Untitled

Sep 10th, 2011
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include <cstdio>
  2. //Описание входных данных
  3. //MW - какой максимальный вес допустим
  4. //wi - вес i-того предмета
  5. //pi - стоимость i-того предмета
  6. const int MW=10000;
  7. const int MAXN=100;
  8. const int UNREACHABLE=(1<<30)+1;
  9. int dp[MW+1]; //сам рюкзак
  10. int w[MAXN];
  11. int p[MAXN];
  12.  
  13. int min(int a,int b)
  14. {
  15.     if(a<b) return a;
  16.     return b;
  17. }
  18.  
  19. int main()
  20. {
  21.     int n; //количество предметов
  22.     //инициализируем рюкзак. Мы можем получить вес 0 заплатив 0 единиц.
  23.     //остальные веса пока недостижимы
  24.     dp[0]=0;
  25.     for(int i=1;i<=MW;i++)
  26.         dp[i]=UNREACHABLE;
  27.        
  28.     scanf("%d",&n);
  29.     for(int i=0;i<n;i++)
  30.         scanf("%d%d",&w[i],&p[i]);
  31.    
  32.     //запускаем рюкзак
  33.     //переберём каждый предмет
  34.     for(int i=0;i<n;i++)
  35.     {
  36.         //будем перебирать веса с конца, чтобы мы не взяли случайно один и тот же предмет много раз
  37.         //ведь если мы знаем, что вес j достижим, то мы сделаем вес j+w[i] достижимым. а потом если будем идти по возрастанию
  38.         //мы увидим, что j+w[i] достижим. а этого быть не должно
  39.         //начинаем с MW-w[i], т.к. j+w[i] должно быть <=MW
  40.         for(int j=MW-w[i];j>=0;j--)
  41.             if(dp[j]!=UNREACHABLE)
  42.                 dp[j+w[i]]=min(dp[j]+p[i],dp[j+w[i]]);
  43.     }
  44.     //dp[j] - можно ли и с какой минимальной стоимостью получить вес j
  45. }
Advertisement
Add Comment
Please, Sign In to add comment