求助状压dp,60pts TLE
查看原帖
求助状压dp,60pts TLE
294736
bovine__kebi楼主2020/8/1 16:31

RT,代码如下

#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast","-funroll-loops","-fdelete-null-pointer-checks")
#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#include<bits/stdc++.h>
using namespace std;
const int maxn=25;
const int maxm=(1<<20)+5;
int a[maxn];
int n,m;
int ans2=-0x3f3f3f3f;
bool isok[maxm];
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int s=1;s<(1<<n);s++)
    {
        int cnt=0;
        for(int i=0;i<n;i++)
        {
            if(s&(1<<i))cnt++;
        }
        if(cnt==n-m)isok[s]=1;
    }
    for(int s=1;s<(1<<n);s++)
    {
        if(!isok[s])continue;
        bitset<maxm>ans;ans[0]=1;
        for(int j=0;j<n;j++)
        {
            if(!(s&(1<<j)))continue;
            ans=ans|ans<<a[j];
        }
        ans2=max(ans2,(int)ans.count());
    }
    printf("%d\n",ans2-1);
}

感觉复杂度没有很炸裂啊,O(2n×n)O(2^n\times n) 差不多在 n=20n=20 的时候也才 2e7,不知道为什么常数那么大。

2020/8/1 16:31
加载中...