比赛 |
202103省实验桐柏一中普及组联赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
自助者天助 |
最终得分 |
100 |
用户昵称 |
yrtiop |
运行时间 |
0.289 s |
代码语言 |
C++ |
内存使用 |
7.07 MiB |
提交时间 |
2021-03-22 19:55:57 |
显示代码纯文本
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int maxn = 30005;
- int f[maxn];
- int n,m;
- int rk[maxn],v[maxn],w[maxn];
- int w1[maxn],v1[maxn],num[maxn],sum = 0;
- int W[maxn << 5],V[maxn << 5];
- bool cmp(int a,int b) {
- return v[a] == v[b] ? w[a] < w[b] : v[a] < v[b];
- }
- int main() {
- freopen("delicious.in","r",stdin);
- freopen("delicious.out","w",stdout);
- scanf("%d%d",&n,&m);
- for(int i = 1;i <= n;++ i) {
- scanf("%d%d",&w[i],&v[i]);
- rk[i] = i;
- }
- sort(rk + 1 , rk + 1 + n , cmp);
- for(int i = 1;i <= n;++ i) {
- int t = rk[i],s = rk[i - 1];
- if(v[s] != v[t]||w[s] != w[t]) {
- v1[++ sum] = v[t];
- w1[sum] = w[t];
- num[sum] = 1;
- }
- else {
- ++ num[sum];
- }
- }
- int cnt = 0;
- for(int i = 1;i <= sum;++ i) {
- int y = num[i],s = 1;
- while(y >= s) {
- V[++ cnt] = v1[i] * s;
- W[cnt] = w1[i] * s;
- y -= s;
- s <<= 1;
- }
- V[++ cnt] = v1[i] * y;
- W[cnt] = w1[i] * y;
- }
- for(int i = 1;i <= cnt;++ i) {
- for(int j = m;j >= W[i];-- j) {
- f[j] = max(f[j] , f[j - W[i]] + V[i]);
- }
- }
- printf("%d",f[m]);
- fclose(stdin);
- fclose(stdout);
- return 0;
- }