#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了?