ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

codeforces E - Selling Souvenirs

2022-07-18 16:02:47  阅读:182  来源: 互联网

标签:Selling up int codeforces long Souvenirs 1ll dp 1000


 

#记录一下自己一步一步跳进去的坑

1.比如说还在纠结为什么w明明不会太大为什么开longlong

因为不开的话这边会爆掉阿:    return a.c*b.w>b.c*a.w;

2.比如说我的做法是把性价比排序,然后直接贪心选,剩下的再dp,同时卡一下边界

but一直卡不过去,开大了过不去T,开小了同样过不去wa

这是因为直接贪心选这个做法,不能保证正确性(属于我不能证伪,但数据测出来如此hh

 

看了一下其他人的写法,是贪心排序+dp,然后dp的优化在于: 

for(int j=up;j>=max(f[i].w,1ll*up-1000);j--)

时间复杂度:O(1000*N),甚至1000还可以更小点,我觉得10左右就差不多,有人说6

这是因为在排序后,设想当前枚举到的容量上限为150,其实前100个最优解已经是固定的了

越枚举到后面,这个物件的价值越小,越不可能代替前面的更优的物件,去更新前面的答案

如果不会证明的话1000也够用啦>_<

#include<bits/stdc++.h>
using namespace std;
struct lys{long long w,c;}f[100007];
long long dp[300007];
int n,m;
bool cmp(lys a,lys b){
    return a.c*b.w>b.c*a.w;
}
void solve(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>f[i].w>>f[i].c;
    
    sort(f+1,f+n+1,cmp);
    long long up=0;
    
    for(int i=1;i<=n;i++)
    {
        up=min(up+f[i].w,1ll*m);
        for(int j=up;j>=max(f[i].w,1ll*up-1000);j--)
         dp[j]=max(dp[j],dp[j-f[i].w]+1ll*f[i].c);
    }
    long long ans=0;
    for(int i=1;i<=up;i++){
        ans=max(ans,dp[i]);
    }
    cout<<ans;
}
int main(){
    //freopen("lys.in","r",stdin);
    solve();
}

 

标签:Selling,up,int,codeforces,long,Souvenirs,1ll,dp,1000
来源: https://www.cnblogs.com/liyishui2003/p/16490783.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有