问题描述

100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

还可以表示为:100 = 82 + 3546 / 197。

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。

输入格式

从标准输入读入一个正整数N (N<1000*1000)

输出格式

程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法!

样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6
解法一:直接用c++里面求全排列的函数next_permutation,这样比较好理解,但用时比较长
#include<iostream>
#include <algorithm>
using namespace std; int sum(int start,int end,int a[])
{
int i,sum=0;
for(i=start; i<end; i++)
sum=sum*10+a[i];
return sum;
} int main()
{
int m,aws=0,a[10];
int i,j; scanf("%d",&m);
for(i=0; i<9; i++)
a[i]=i+1;
do
{
for(i=1; i<10; i++)
{
int m1=sum(0,i,a);
if(m1>=m)
continue; //不满足条件直接跳过
for(j=i+(10-i)/2; j<9; j++) //从第一个数用过的数后开始
{
int m2=sum(i,j,a);
int m3=sum(j,9,a);
if(m2%m3==0&&m==m1+m2/m3)
{
aws++; // 统计符合条件的
}
}
}
}
while(next_permutation(a, a+9)); //枚举全排列
printf("%d",aws);
return 0;
}

  其中next_permutation函数部分可以用dfs代替,代码如下:(关于用dfs实现全排列的思想请见链接:http://www.cnblogs.com/curo0119/p/8414195.html

#include<cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int flag[11]={0};
int a[11];
int ncount=0;
int pp=0;
int getSum(int start,int end,int a[])
{
int sum=0;
for(int i=start;i<end;i++)
{
sum=sum*10+a[i];
}
return sum;
}
void Found(int a[],int n)
{
int re1,re2,re3;
re1=0;
re2=0;
re3=0;
for(int i=1;i<10;i++)
{
re1=getSum(0,i,a);
if(re1>=n) continue;
for(int j=i+(10-i)/2;j<9;j++)
{
re2=getSum(i,j,a);
re3=getSum(j,9,a);
if(re2>re3&&re2%re3==0&&n==re1+re2/re3)
{
ncount++;
}
}
}
}
void DFS(int start,int m)//对1~9进行全排列
{
int i;
if(start==9)
Found(a,m); //每排好一个序列调用一次该函数,判断是否满足等式
else
{
     //排序列
for(i=1; i<10; i++)
{
if(!flag[i])
{
a[start]=i;
flag[i]=1; //标记是否用过
DFS(start+1,m);//选择好一位开始选下一位
flag[i]=0;//根据递归函数的压栈过程,把当前序列已经标记过的解除标记(从0到9全解除后再进入下一次序列的生成)
} //当返回上一级的dfs的时候,会接着执行下面的语句,不会重复调用dfs了(函数的压栈过程)
}
}
} int main()
{
int n;
scanf("%d",&n);
int i,j;
int a[10]; for(i=0;i<9;i++)
{
a[i]=i+1;
}
DFS(0,n);
printf("%d",ncount);
return 0;
}

  本文转载于:http://blog.csdn.net/zhangffyy/article/details/54952548

带分数(dfs,next_permutation)的更多相关文章

  1. 蓝桥杯 带分数 DFS应用

    问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...

  2. 三羊献瑞:dfs / next_permutation()

    三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉  +   三 羊 献 瑞-------------------   三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的汉字代 ...

  3. 蓝桥杯练习系统历届试题 带分数 dfs

    问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...

  4. 洛谷 P1618 三连击(升级版)【DFS/next_permutation()/技巧性枚举/sprintf】

    [链接]:https://www.luogu.org/problemnew/show/P1618 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试 ...

  5. 带分数dfs+剪枝优化

    #include<iostream>#include<cstdio>#include<cstdlib>#include<ctime>using name ...

  6. 2015第六届蓝桥杯C/C++ B组

    奖券数目:枚举 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其 ...

  7. HDU1027 Ignatius and the Princess II 【next_permutation】【DFS】

    Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ( ...

  8. 蓝桥杯 算法提高 3000米排名预测 DFS 递归搜索 next_permutation()使用

    #include <iostream> #include <algorithm> #include <queue> #include <cstring> ...

  9. 蓝桥杯 - 带分数 (DFS)

      历届试题 带分数   时间限制:1.0s   内存限制:256.0MB        问题描写叙述 100 能够表示为带分数的形式:100 = 3 + 69258 / 714. 还能够表示为:10 ...

随机推荐

  1. 禁止火狐浏览器缓存input标签方法

    禁止火狐浏览器缓存input标签方法 问题1:在火狐浏览器里,云平台的输入框.选项框.勾选框…填写之后按F5刷新页面,之前填的东西会保留着,其它浏览器不会火狐强制刷新用Ctrl + F5 浏览器自动保 ...

  2. 在 Linux 中使用超级用户权限

    在你想要使用超级权限临时运行一条命令时,sudo 命令非常方便,但是当它不能如你期望的工作时,你也会遇到一些麻烦.比如说你想在某些日志文件结尾添加一些重要的信息,你可能会尝试这样做: $ echo & ...

  3. 2018跳槽面试必备之深入理解 Java 多线程核心知识

    导语:多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲.在平时工作中如若使用不当会出现数据错乱.执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线 ...

  4. echart知识点、常用图形

    原文地址:https://www.cnblogs.com/kewenxin/p/9338272.html 本文是自己在项目中需要运用到的echarts图形进行整理,都有完整的代码.echarts原型, ...

  5. 如何在 Linux 中挂载 ISO 文件

    在 Windows 中,我们常常使用 Daemon Tools 和 Virtual CloneDrive 等虚拟光驱软件挂载光盘镜像,下面我们一起来学习在 Linux 中如何挂载 ISO 文件. 在 ...

  6. linux下命令行工具gcp显示拷贝进度条

    1.环境: ubuntu16.04 Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x ...

  7. Inversion of Control Containers and the Dependency Injection pattern

    https://martinfowler.com/articles/injection.html One of the entertaining things about the enterprise ...

  8. (转)Nuts and Bolts of Applying Deep Learning

    Kevin Zakka's Blog About Nuts and Bolts of Applying Deep Learning Sep 26, 2016 This weekend was very ...

  9. 【Android实验】 UI设计-ListView

    目录 实验目的 实验要求 实验内容 实现效果 实验代码 实验总结 实验目的 学习使用ListView 学习使用menu 实验要求 实现一个列表,其中显示班级学号姓名,提供添加功能,如需要删去某一项,长 ...

  10. The way to Go(1): Introduction

    Reference: Github: Go Github: The way to Go Introduction to Go 设计要求: 能够以更快的速度开发软件 开发出的软件能够很好地在现代的多核计 ...