Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- //Описание входных данных
- //MW - какой максимальный вес допустим
- //wi - вес i-того предмета
- //pi - стоимость i-того предмета
- const int MW=10000;
- const int MAXN=100;
- const int UNREACHABLE=(1<<30)+1;
- int dp[MW+1]; //сам рюкзак
- int w[MAXN];
- int p[MAXN];
- int min(int a,int b)
- {
- if(a<b) return a;
- return b;
- }
- int main()
- {
- int n; //количество предметов
- //инициализируем рюкзак. Мы можем получить вес 0 заплатив 0 единиц.
- //остальные веса пока недостижимы
- dp[0]=0;
- for(int i=1;i<=MW;i++)
- dp[i]=UNREACHABLE;
- scanf("%d",&n);
- for(int i=0;i<n;i++)
- scanf("%d%d",&w[i],&p[i]);
- //запускаем рюкзак
- //переберём каждый предмет
- for(int i=0;i<n;i++)
- {
- //будем перебирать веса с конца, чтобы мы не взяли случайно один и тот же предмет много раз
- //ведь если мы знаем, что вес j достижим, то мы сделаем вес j+w[i] достижимым. а потом если будем идти по возрастанию
- //мы увидим, что j+w[i] достижим. а этого быть не должно
- //начинаем с MW-w[i], т.к. j+w[i] должно быть <=MW
- for(int j=MW-w[i];j>=0;j--)
- if(dp[j]!=UNREACHABLE)
- dp[j+w[i]]=min(dp[j]+p[i],dp[j+w[i]]);
- }
- //dp[j] - можно ли и с какой минимальной стоимостью получить вес j
- }
Advertisement
Add Comment
Please, Sign In to add comment