2020 ICPC Knapsack(超大 01 背包)

 

 

如果按照正常解法求解 01 背包问题,一定会超时,先按照性价比选择,减少背包的容量,这样再用一次 01 背包解决问题即可 

const int N=2e5+5;

    int i,j,k;
    int n,m,t;
    ll dp[100+5];
    struct Node
    {
        ll w,v;
    }a[N];

bool cmp(Node a,Node b)
{
    return a.v*b.w>a.w*b.v;    
}

int main()
{
    //IOS;
    while(~sdd(n,m)){
        for(int i=1;i<=n;i++) sll(a[i].w),sll(a[i].v);
        sort(a+1,a+1+n,cmp);
        int cur=0;
        ll ans=0;
        for(int i=1;i<=n && m>=100;i++){
            ans+=a[i].v;
            m-=a[i].w;
            cur=i;
        }
        ms(dp,0);
        for(int i=cur+1;i<=n;i++){
            for(int j=m;j>=a[i].w;j--){
                dp[j]=max(dp[j],dp[j-a[i].w]+a[i].v);
            }
        }
        pll(ans+dp[m]);
    }
    //PAUSE;
    return 0;
}

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页