【积累】【dp】01背包+概率优化(乱搞

2020 Multi-University Training Contest 4 Contest of Rope Pulling

就 想不到还能这么搞。学到了

标程:有那么一点点复杂,但是会更优(更快)一点。

个人(参考了博客:

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int mod=998244353;
const int inf=0x3f3f3f3f;
const int maxn=1e6+5;

struct P{
    int w,v,ly;
}a[2005];
mt19937 mt(time(0));
ll f[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d%d",&a[i].w,&a[i].v),a[i].ly=1;
        for(int i=1;i<=m;i++)scanf("%d%d",&a[i+n].w,&a[i+n].v),a[i+n].ly=-1;
        shuffle(a+1,a+1+n+m,mt);
        int up=80000;ll ans=0;
        mem(f,-inf);f[40000]=0;
        for(int i=1;i<=n+m;i++)
        {
            if(a[i].ly>0){
                for(int j=up;j>=a[i].w;j--)
                    f[j]=max(f[j],f[j-a[i].w]+a[i].v);
            }
            else {
                for(int j=0;j<=up-a[i].w;j++)
                    f[j]=max(f[j],f[j+a[i].w]+a[i].v);
            }
            ans=max(ans,f[40000]);
        }
        printf("%lld\n",ans);
    }
}

posted @ 2020-08-08 03:29  草丛怪  阅读(94)  评论(0编辑  收藏  举报