题目
分析
有点类似于多重背包的拆分,反正你把他拆开就好
首先所有的钱袋都可以看成一个取或不取的情况。那么这些钱袋取或不取就可以看作0或1,也就是说,要使用一些数字表示一个范围里的所有数,同时这又很二进制(取或不取)。所以我们就把钱袋里钱的数量定为2^n个。
代码
#include<bits/stdc++.h>
int m,tot=0;
int ans[30];
int main()
{
scanf("%d",&m);
for(;m>>1;m>>=1)
ans[++tot]=(m>>1)+(m&1);
printf("%d\n1",tot+1);
while(tot)
printf(" %d",ans[tot--]);
return 0;
}