[HNOI 2006] 鬼谷子的钱袋


BZOJ 1192
Luogu2320

运用了“分治”的思想,先选择\(n/2\),然后将问题转化为\([1,n/2]\)范围内的子问题,以此类推

一开始以为是将 n 的二进制表示中所有是 1 的拿出来,比如这样:

#include 
#include 
using namespace std;
int main(){
    int n;
    cin>>n;
    int cnt=0;
    for(int i=0;(1<

但是其实并非如此,比如当 n=100 时,n 的二进制表示为 1100100 ,于是 1 并不在解中,然而如果没有 1 ,那么所有的奇数都无法被拼成。

BZOJ 上只要求输出个数,而洛谷上还要输出解的方案

#include 
using namespace std;
int main()
{
    int n,a[31];
    cin>>n;
    int cnt=0;
    while(n){
        a[++cnt]=(n&1?(n>>1)+1:n>>1);
        n>>=1;
    }
    cout<=1;i--) cout<