bitset优化背包...

题目:
https://s3.amazonaws.com/codechef_shared/download/translated/SNCKEL16/mandarin/RWALK.pdf
这题可以转化成背包。
L,R什么的可以无视,因为替换他们不用时间。
将竖直方向和左右方向分成两个数组。
分别求出他们的和sum1,sum2。将其转化成背包,看成sum1的背包最多可以选多少个(长度和*2),因为要回到原点所以是长度和*2。
DP跑的时间比较久(2500+ms),用bitset(300+)优化一下(刚学的bitset,所以记下来…然而不懂为什么可以快那么多)
DP代码:

int DP(int *p,int n)
{
    memset(dp,0,sizeof(dp));
    int sum=0;
    for(int i=0; isum+=p[i];
    for(int i=0; ifor(int j=sum; j>=2*p[i]; j--)
            dp[j]=max(dp[j],dp[j-2*p[i]]+2*p[i]);
    return sum-dp[sum];
}

bitset代码:

int Bitset(int *s,int num)
{
    int sum=0,ans=inf;
    bitset<550*550/2>bs;//选出的值最多就是(500*501)/2
    bs[0]=1;
    for(int i=0; i//选了某个物品
        /*for(int j=0; j
    }
    for(int i=0; iif(!bs[i]) continue;
        ans=min(ans,abs(i*2-sum));
    }
    return ans;
}
/*
如果bs[i]==1,那么说明第i个位置选了前面的k个物品,并且i的值就是目前背包的权和
例如 一个容量只有18的背包,有1个重量和权值为7的物品和一个重量和权值为9的物品 
10000001010000001000000
说明这里有0,7,9,16(=9+7),的背包
那么按这道题来算的话,答案应该是18-9*2=0;
*/

虽然还是不怎么理解bitset的妙用=_=但是慢慢来吧。。

你可能感兴趣的:(bitset,DP)