CF538B Quasi Binary

Quasi Binary

https://ac.nowcoder.com/acm/problem/110925

  • 前言

    大菜鸡早上做题,误视作贪心,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;
}
每日一题 文章被收录于专栏

每天的题,为了牛币

全部评论

相关推荐

11-27 12:43
已编辑
门头沟学院 C++
点赞 评论 收藏
分享
ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
评论
2
1
分享
牛客网
牛客企业服务