链接:https://vjudge.net/problem/CodeForces-1221A
题意:
给出一些数这些数都是2的指数,每次都可以任意选两个数相加,操作次数不限,问最后能否得到 2048
分析:
首先判断2048是否存在,如果不存在寻找两个1024,如果1024不存再则递归寻找4个512,如果存在一个递归寻找2个512,如果存在两个则返回true
code:
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
map<int, int> mp;
int dfs(int num, int n)
{
if(num < 1)
return 0;
if(mp[num] >= n)
return 1;
return dfs(num/2, (n - mp[num]) * 2); // 递归寻找下一个数,并给出找几个
}
int main()
{
// setbuf(stdout,NULL);
// setvbuf(stdout,NULL,_IONBF,0); // 设置缓冲区为空
// ios::sync_with_stdio(false);
// cin.tie(0);
int q;
cin >> q;
while(q--)
{
mp.clear();
int n;
cin >> n;
int num;
for(int i = 0; i < n; i++)
{
cin >> num;
if(num <= 2048)
mp[num] ++;
}
if(dfs(2048, 1))
cout << "YES\n";
else
cout << "NO\n";
}
return 0;
}