(dfs剪枝)(递归)1209. 带分数

简介: (dfs剪枝)(递归)1209. 带分数

题目链接

1209. 带分数 - AcWing题库


一些话


流程

1.由“带分数中,数字 1∼91∼9 分别出现且只出现一次(不包含 00)。”知,需要枚举的数是1-9


       9作为时间复杂度中的n,n <=30,可以用dfs,dp


2.”输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。“


       根据这句话得知此题是要枚举情况然后判断情况合不合题意,合则加种数,由于是求种类数 而不是最优解,此题更适合用dfs递归


3.带分数形式是


       100=3+69258 / 714,通过枚举其中两个数就可以求出第三个数,通过判断第三个数用到的数字有没有出现过或者有没有0,还要判断算上第三个数中用到的数字,所有数字是否都用过了就可以知道是否符合题意


4.通过两个dfs的嵌套可以实现同时枚举两个数字,但时间复杂度非常高,最好要进行剪枝(dfs参数符合某种情况时直接return)


套路


1.同时枚举两个数

void dfs_c(int u,int a,int c){
        for(int i = 1;i <= 9;i++){
                ……
                dfs(u+1,a,c * 10 + 1 );
        }
}
void dfs_a(int u,int a){       
        dfs_c(u ,a,0);
}

2.数组的回溯

设置一个backup数组,

在操作前 memcpy(backup,f,sizeof f);备份f数据

回溯时再反过来

memcpy(f,backup,sizeof f); 恢复现场


ac代码

//dfs的参数可以写上需要回溯的内容,一些回溯操作复杂的可以直接写上
//17:25~47已经对了,但没认真看样例,导致一直在找不存在的bug
// 19:35~44 accepted
//19:44~52
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 10;
int f[N],n,ans;
bool st[N],backup[N];
bool check(int a,int c){
    long long b = n * (long long) c - c * a;
    if(!a || !b || !c) return false;
    memcpy(backup,st,sizeof st);
    while(b){
        int x = b % 10;
        b /= 10;
        if(!x || backup[x]) return false;
        backup[x] = true;
    }
    for(int i = 1;i <= 9;i++) if(!backup[i]) return false;
    return true;
}
void dfs_c(int u,int a,int c){
    if(u >= 9){
        return ;
    }
    if(check(a,c)) ans++;
    for(int i = 1;i <= 9;i++){
        if(!st[i]){
            st[i] = true;
            dfs_c(u+1,a,c * 10 + i);
            st[i] = false;
        }
    }
}
void dfs_a(int u,int a){
    if(a >= n) return;
    for(int i = 1;i <= 9;i++){
        if(!st[i]) {
            st[i] = true;
            dfs_a(u+1,a * 10 + i);
            st[i] = false;
        }
    }    if(a)dfs_c(u,a,0);
}
int main(){
    cin >> n;
    dfs_a(0,0);
    cout << ans << endl;
    return 0;
}
目录
相关文章
|
监控 Linux 网络安全
百度搜索:蓝易云【CentOS7上安装Squid代理详细教程【附带使用教程】】
通过以上步骤,你已经成功安装和配置了Squid代理服务器,并且可以在客户端设备或应用程序中使用它进行代理访问。根据需要,你可以进一步定制Squid的配置,例如添加更多的访问控制规则或进行高级功能的配置。请注意,Squid还有许多其他的功能和选项,你可以参考Squid的官方文档以获取更详细的信息和配置指南。
704 0
|
6月前
|
人工智能 自然语言处理 JavaScript
需要的效果它都有,让AI对话开发效率翻倍!这款Ant Design扩展组件库绝了
ant-design-x-vue 是基于 Ant Design Vue 的扩展组件库,专注于增强聊天和AI交互场景的体验。项目提供开箱即用的对话式UI组件,支持消息气泡、智能建议、思维链展示等特色功能,特别适合快速搭建智能客服、AI助手类应用。
580 5
|
11月前
|
存储 算法 Java
聊聊jvm的内存结构, 以及各种结构的作用
【10月更文挑战第27天】JVM(Java虚拟机)的内存结构主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。各部分协同工作,为Java程序提供高效稳定的内存管理和运行环境,确保程序的正常执行、数据存储和资源利用。
325 10
|
存储 缓存 负载均衡
JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)
JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)
69178 9
JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
|
Python
Python报错: No module named 'lxml'
Python报错: No module named 'lxml'
586 1
|
数据采集 机器学习/深度学习 分布式计算
从0到1搭建车企数字化营销中台(4):客户数据平台(CDP)
CDP作为数字化营销中台的核心数据引擎,承载着拉通客户全渠道、全旅程链路的数据,实现智能洞察和营销决策
3656 0
从0到1搭建车企数字化营销中台(4):客户数据平台(CDP)
|
存储 安全 数据库
数据库期末复习---简答题整理
数据库期末复习---简答题整理
203 0
|
消息中间件 存储 分布式计算
【大数据学习篇11】广告点击流实时统计
【大数据学习篇11】广告点击流实时统计
480 0
【大数据学习篇11】广告点击流实时统计
|
领域建模 uml Android开发

热门文章

最新文章