TLE 50Pts 求助
查看原帖
TLE 50Pts 求助
601236
_WHITE_NIGHT_楼主2023/9/7 21:20

QAQRtQAQ Rt 求助,不知道怎么优化了,悬赏一个关注

#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);
}
2023/9/7 21:20
加载中...