解题报告——2018级2016第二学期第一周作业

 

解题报告——2018级2016第二学期第一周作业

D 算24

题目描述

描述

给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。

这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。

比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。

输入

输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。

输出

对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。

样例输入

5 5 5 1

1 1 4 2

0 0 0 0

样例输出

YES

NO

 

代码

#include<cstdio>#include<cmath>#include<cstring>#include<iostream>#include<cstdlib>

using namespace std;

double a[5];bool flag=false;

void dfs(double b[],int k){

if(flag)return ;

if(k==1){

if(fabs(b[1]-24)<1e-4)flag=true;//解是否正确

}

else for(int i=1;i<=k;i++)

for(int j=1;j<=k;j++)

if(i!=j){

double bb[5];int js=0;

//bb用来存储新状态

//先将没选中的数存入bb

for(int p=1;p<=k;p++)

if(p!=i&&p!=j)bb[++js]=b[p];

double op=1e10;//用来存放计算结果

for(int cf=1;cf<=4;cf++)

switch(cf){

case 1:op=b[i]+b[j];

bb[++js]=op;//将计算结果存入bb

dfs(bb,js);

js--;

break;

case 2:op=b[i]-b[j];

bb[++js]=op;

dfs(bb,js);

js--;

break;

case 3:op=b[i]*b[j];

bb[++js]=op;

dfs(bb,js);

js--;

break;

case 4:if(b[j]!=0){op=b[i]/b[j];

bb[++js]=op;

dfs(bb,js);

js--;}

break;

}

}

}

int main(){

while(1){

flag=false;

for(int i=1;i<=4;i++)

cin>>a[i];

if(a[1]==0)break;//是否读完

dfs(a,4);

if(flag)cout<<"YES"<<endl;

else cout<<"NO"<<endl;

}

return 0;

}

分析

这题的状态是k个数;

当在只有一个数时那便是问题有解了;所有出口为一个数;

可能的路径:以四变三为例+,*有十二种,/,-有二十四种,总共会有三十六种;

但其中会有可行性判断:除法是除数为0时便不可以;

不过在其中要维护状态那便用a数组和k;

不过为了省时间可以在有正确解(如果le-4)时出去;

没有时用bb存储没有选到的数,然后用switch列举可能的四种运算;

注意:要用double 来存储因为如题目上讲的会有分数;

 

算法:穷举算法;

jshzoi的更多相关文章

随机推荐

  1. iOS 面试题(四):block 什么时候需要构造循环引用 --转自唐巧

    问题 有没有这样一个需求场景,block 会产生循环引用,但是业务又需要你不能使用 weak self? 如果有,请举一个例子并且解释这种情况下如何解决循环引用问题. 答案 需要不使用 weak se ...

  2. Python开发【第九章】:堡垒机实例

    一.堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作 模块安装 C:\Program Files\Python 3.5\Scri ...

  3. vue.js在windows本地下搭建环境和创建项目

    Vue.js是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.另一方面,Vu ...

  4. python基础:交互式解释器

    什么是"交互式python解释器"? 当你看到">>>"符号,就意味着你进入交互式python解释器,又称作"提示符". ...

  5. iOS代码签名理解

    前言 做了几年iOS app coder了,对于证书的生成.使用流程烂熟于心,然而对于这套机制的原理却一直不甚理解.近来由于工作需要仔细研究了一下,特将自己的学习经验记录于此,以供大家学习指正. 问题 ...

  6. Android Activity 切换动画(非原创)

    在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity ...

  7. Android系统拍照源码

    个人对于Android系统拍照的一些总结:一种自定义图片拍照路径 ,另一种直接利用Android拍照后经过处理的缩略图 特别注意第一种方式需要增加SDK读写权限: <uses-permissio ...

  8. <<小朋友的数字>>核心代码

    for(i=l;i<=n;i++) { a[i]=read(); t=t+a[i]; if (t>maxn) maxn=t if( t<0) t=0; b[i]=maxn; }

  9. Linux Bond的原理及其不足

    http://www.tektea.com/archives/1969.html. 在企业及电信Linux服务器环境上,网络配置都会使用Bonding技术做网口硬件层面的冗余,防止单个网口应用的单点故 ...

  10. msql,触发器无事物回滚,插入之前满足条件再插入

    很少写mysql的触发器和存储过程,由于需要需要做一个很小的判断,要用到触发器,要达到的效果就是,插入之前判断是否满足条件如果不满足就不插入 如果用sqlserver 或者orcale 就很简单,按s ...