QAQRt 求助,不知道怎么优化了,悬赏一个关注
#include<bits/stdc++.h>
using namespace std;
namespace FastIO
{
const int Mt = 1e5;
inline char getch()
{
static char buf[Mt],*p1 = buf,*p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf,1,Mt,stdin),p1 == p2) ? EOF : *p1++;
}
inline int input()
{
int num = 0,f = 1;
char ch = getch();
while(ch < '0' || ch > '9')
{
if(ch == '-') f = -1;
ch = getch();
}
while(ch >= '0' && ch <= '9')
{
num = (num << 1) + (num << 3) + (ch ^ 48);
ch = getch();
}
return num * f;
}
inline void printNum(int num)
{
if(num >= 10) printNum(num / 10);
putchar(num % 10 + 48);
}
inline void print(int num,char ch = ' ')
{
if(num < 0) putchar('-'),num = -num;
printNum(num);
putchar(ch);
}
}
using FastIO::input;
using FastIO::print;
const int N = 25;
int n,m,ans,num;
int ipt[N];
bool vis[N];
vector <int> v;
map <int,bool> mp;
void solve(int id,int sum)
{
if(!mp[sum] && sum) mp[sum] = 1,num++;
if(id >= v.size()) {ans = max(ans,num);return;}
solve(id+1,sum);
solve(id+1,sum+v[id]);
}
void dfs(int id,int cnt)
{
if(cnt > m) return;
if(id > n)
{
if(cnt == m)
{
mp.clear();num = 0;
solve(0,0);
}
return;
}
vis[id] = 1,v.push_back(ipt[id]);
dfs(id+1,cnt);
vis[id] = 0,v.pop_back();
dfs(id+1,cnt+1);
}
int main()
{
n = input(),m = input();
for(int i = 1;i <= n;i++)
ipt[i] = input();
sort(ipt+1,ipt+1+n);
dfs(1,0);
print(ans);
}