题目大意
给出n,k,问n能否分解为k个2的幂之和(1=2^0)。
解题思路
将n分解成t个2的幂之和
参照二进制转十进制的过程,如13,二进制下为1101,所以15=1+2^1 +22+24
如果k<t,输出NO
每次将最大的幂m,分解成两个m/2,知道最大的幂为1为止,如果还不够k个输出NO代码
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
priority_queue <int> Q;
int num;
bool work(int &n)
{
int t=1;
num++;
while (t*2<=n) t=t*2;
n=n-t;
Q.push(t);
if (n==0) return false;
else return true;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
{
while (true)
{
bool sym=work(n);
if (!sym) break;
}
if (num>k) printf("NO\n");
else
{
bool sym=true;
for (int j=1;j<=k-num;j++)
{
int x=Q.top();
if (x==1)
{
sym=false;
break;
}
Q.pop();
Q.push(x/2);
Q.push(x/2);
}
if (!sym) printf("NO\n");
else
{
printf("YES\n");
while (!Q.empty())
{
int x=Q.top();
cout<<x<<" ";
Q.pop();
}
}
}
}
}