简单的水题硬是给我弄复杂了。。。
简单贪心解法在这里http://www.cnblogs.com/qscqesze/p/4458883.html
先把所有01组合列出来,然后动规解决的OTZ
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<cmath>
#include<ctime>
#define mx 200005
#define LL long long
#define mod 1000000009
#define esp 1e-12
#define y1 y1234
#define inf 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const double PI = acos(-1.0);
using namespace std;
int a[80];
int dp[1000001];
int fa[1000001];
int main(){
int n;
cin >> n;
a[0] = 0, a[1] = 1;
int t = 1;
while (t < 6){
int k = 1 << t;
int kk = 1 << (t - 1);
int c = k;
for (int i = 0; i < k; i++){
a[c++] = a[kk + i] * 10;
a[c++] = a[kk + i] * 10 + 1;
}
t++;
}
dp[0] = 0;
for (int i = 1; i <= n; i++)dp[i] = inf;
memset(fa, 0, sizeof(fa));
for (int i = 1; i <= n; i++){
for (int j = 0; j <= 64; j++){
if (i >= a[j]){
if (dp[i]>dp[i - a[j]] + 1){
dp[i] = dp[i - a[j]] + 1;
fa[i] = j;
}
}
}
}
cout << dp[n] << endl << a[fa[n]];
n -= a[fa[n]];
while (n){
printf(" %d", a[fa[n]]);
n -= a[fa[n]];
}
cout << endl;
return 0;
}