问题描述

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. 从1.6W名面试者中收集的Java面试题精选汇总(内附知识脑图)

      本篇的面试题是接之前读者的要求,发出来的. 首先,声明下,以下知识点并非全部来自BAT的面试题. 如果觉得在本文中笔者总结的内容能对你有所帮助,可以点赞关注一下. 本文会以引出问题为主,后面有时间 ...

  2. P2455 [SDOI2006]线性方程组(real gauss)

    P2455 [SDOI2006]线性方程组 (upd 2018.11.08: 这才是真正的高斯消元模板) 找到所消未知数(设为x)系数最大的式子,把它提上来 把这个式子的 x 系数约成1 把这个式子用 ...

  3. SCP报错:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    经过google,出现这个问题的原因是,这是ssh的问题, GkFool大神说(第一次使用SSH连接时,会生成一个认证,储存在客户端的known_hosts中) 我的解决办法是: ssh-keygen ...

  4. 20145339顿珠 Exp5 MSF基础应用

    20145339顿珠 Exp5 MS08_067漏洞测试 实验过程 IP地址:192.168.1.104 虚拟机ip:192.168.1.102 在控制台内使用search ms08_067查看相关信 ...

  5. .Family_物联网

    群名称 : .Family_物联网 QQ群号: 群介绍 基于嵌入式,构建各通信模式,网关,平台软件,工业系统等领域,欢迎各位朋友加群,交流学习!

  6. 网络安全、Web安全、渗透测试之笔经面经总结(二)

    这篇文章涉及的知识点有如下几方面: 1.SSL Strip(SSp)攻击到底是什么? 2.中间人攻击——ARP欺骗的原理.实战及防御 3会话劫持原理 4.CC攻击 5.添加时间戳防止重放攻击 6.浅析 ...

  7. url rewrite导致的500.19 0x8007000d

    https://stackoverflow.com/questions/13532447/http-error-500-19-iis-7-5-error-0x8007000d It seems you ...

  8. FieldOffset

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.G ...

  9. 将DevExpress.Utils.ImageCollection变量的image导出

    private void tspBtnExportExcel_Click(object sender, EventArgs e) { //暂时用来导出图片 string filePath = Syst ...

  10. 【附7】turbine

    一.作用 聚集同一个微服务的相同的commandKey.Threadpool.commandGroupKey数据进行聚合 二.配置 1.集群(cluster)(turbine聚集数据的粒度) turb ...