前言
大菜鸡早上做题,误视作贪心,QwQ
分析
这就是一个背包问题。因为 n<=1e6 ,可以dfs枚举出所有只含0和1的数。然后,就是一个完全背包。只是在转移的时候记录一下从哪个地方转移过来的,然后回溯就能找到答案。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,tot;
int ans[N],dp[N],pre[N];
inline void Get(int now)
{
if(now>n) return ;
ans[++tot]=now;
Get(now*10+1);
Get(now*10);
}
inline void dfs(int now)
{
if(!now) return ;
dfs(pre[now]);
printf("%d ",now-pre[now]);
}
int main()
{
scanf("%d",&n);
Get(1);
sort(ans+1,ans+tot+1);
tot=unique(ans+1,ans+tot+1)-ans-1;
memset(dp,0x3f,sizeof(dp));dp[0]=0;
for (int i=1;i<=tot;i++)
for (int j=ans[i];j<=n;j++)
if(dp[j-ans[i]]+1<dp[j])
{
dp[j]=dp[j-ans[i]]+1;
pre[j]=j-ans[i];
}
printf("%d\n",dp[n]);dfs(n);
return 0;
}
京公网安备 11010502036488号