解题报告——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. CentOS7.2 创建本地YUM源和局域网YUM源

    1背景 由于开发环境只有局域网,没法使用网上的各种YUM源,来回拷贝rpm包安装麻烦,还得解决依赖问题. 想着搭建个本地/局域网YUM源,方便自己跟同事安装软件. 2环境 [root@min-base ...

  2. C#异步方法的使用

    from:http://www.myext.cn/csharp/a_6765.html 也许业内很多高不成低不就的程序员都会对一些知识点会有些迷惑,原因是平常工作用的少,所以也就决定了你对这个事物的了 ...

  3. 批处理ODBC配置

    工作需要来回切换ODBC配置,用同一个DSN名称访问不同的数据库. 对于linux的odbc配置在odbc.ini文件里,替换不同的文件就可以切换了. 而windows的配置一直通过控制面板里的odb ...

  4. kali 下文件操作

    记得看到一片文章中说要学习linux 不要用kali.. 不感兴趣的东西,还指望我去搞个Ubuntu.... Ctrl+I 清屏 CD命令: cd 进入用户主目录: cd ~ 进入用户主目录: cd ...

  5. c++ 解包tar

    首先我们来看tar文件组成 tar中的数据都是以512字节为单位:tar由三部分组成 “头部+内容+尾部”,其中头部是512字节的头部结构,内容是存放一个文件内容的地方,最后尾部是一个512字节的全零 ...

  6. Windows Phone 六、JSON序列化

    JSON序列化 public class Person { public int Id { get; set; } public string Name { get; set; } public in ...

  7. 使用Python统计深圳市公租房申请人省份年龄统计

    使用Python,HtmlParser来统计深圳市保障房申请人的原籍省份分布,年龄分布等.从侧面可以反映鹏城人的地域分布.以下python代码增大了每一次获取的记录数,从而少提交几次请求.如果按照WE ...

  8. 什么情况下会用到try-catch

    本文不区分语言,只为记录一次有收获的面试. 面试官:什么情况下用到try-catch?程序员:代码执行预料不到的情况,我会使用try-catch.面试官:什么是预料不到的情况呢?程序员:比如我要计算a ...

  9. How to add taxonomy element to a summary view?

    [re: Orchard CMS] This caused me scratching my head for days and now I can even feel it's bleeding. ...

  10. OpenLayers工作原理

    1.数据组织 OpenLayers通过同层(Layer)进行组织渲染,然后通过数据源设置具体的地图数据来源.因此,Layer与Source是密切相关的对应关系,缺一不可.Layer可看做渲染地图的层容 ...