暴力搜索开了O2优化只有80分
查看原帖
暴力搜索开了O2优化只有80分
427060
甲虫独白楼主2021/10/5 10:42
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int w[21];
bool used[21];
bool sw[2000];
int sum,n,m;
int count(int s)
{
    int p=0;
    while(s) 
    {
        if(s&1) p++;
        s=s>>1;
    }
    return p;
}
void change(int t)
{
    for(int i=0;i<n;i++)
    {
        if((t>>i)&1 == 1)
        used[i]=true;
        else
        used[i]=false;
    }
}
void dfs(int start,int su)
{
    int pre=0;
  for(int i=start;i<n;i++)
    {
        if(used[i]) continue;
        if(w[i]!=pre) pre=w[i];
        else continue;
        if(!sw[su+w[i]]) 
        sum++;
        
        sw[su+w[i]]=true;
        dfs(i+1,su+w[i]);
    }
}
int main()
{
    int ma=0;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    scanf("%d",&w[i]);
    sort(w,w+sizeof(w));
    reverse(w,w+sizeof(w));
    int state=(1<<n)-1;
    int t=state;
    if(m!=0)
    {
     while(t)
     {
        sum=0;
        memset(sw,0,sizeof(sw));
        if(count(t)==m) 
        {
            change(t);
            dfs(0,0);
            ma=max(sum,ma);
        }
        t=state&(t-1);
     }
    }
    if(m==0)
    {
        dfs(0,0);
        ma=sum;
    }
    printf("%d",ma);
    return 0;
}

代码如上,暴力搜索用位运算来表示删去的组合,不知道哪里还能优化,不能就用DP了?

2021/10/5 10:42
加载中...