解题报告——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 面试题(五):weak 的内部实现原理 --转自唐巧

    问题 weak 变量在引用计数为0时,会被自动设置成 nil,这个特性是如何实现的? 答案 在 Friday QA 上,有一期专门介绍 weak 的实现原理.https://mikeash.com/p ...

  2. Jenkins搭建的几个坑记下

    坑一 安装cobertura插件后,一定要在工程代码的pom.xml文件里添加如下插件配置: <plugin> <groupId>org.codehaus.mojo</g ...

  3. ADC 转换序列暂时难理解

    通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,程序出错的时候理论上都会产生一个co ...

  4. c 头文件<ctype.h>(一)

    头文件<ctype.h>中声明了一些测试字符的函数. 每个函数的参数均为int类型,参数的值必须是EOF或可用unsigned char类型表示的字符,函数返回值为int类型. 如果参数c ...

  5. WPF绑定xml数据源

    1.界面 <UserControl x:Class="HKDCMS.Client.Demo.UIViews.UIControls.AboutUsControl" xmlns= ...

  6. Android开源图表之树状图和饼状图的官方示例的整理

    最近由于工作需要,所以就在github上搜了下关于chart的三方框架 官方地址https://github.com/PhilJay/MPAndroidChart 由于工作需要我这里整理了一份Ecli ...

  7. 跨列设置column-span

    column-span主要用来定义一个分列元素中的子元素能跨列多少.column-width.column-count等属性能让一元素分成多列,不管里面元素如何排放顺序,他们都是从左向右的放置内容,但 ...

  8. Android Native 代码NDK开发学习笔记

    引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...

  9. System.UnauthorizedAccessException Access to the path "/etc/mono/registry" is denied.

    sudo mkdir /etc/mono/registry sudo mkdir /etc/mono/registry/LocalMachine sudo chmod g+rwx /etc/mono/ ...

  10. ubuntu16.04.1下的mysql修改默认编码

    在Ubuntu 下配置 Mysql 的字符编码.安装完 Mysql 后,系统默认的字符编码是 latin1 ,输入的是中文,可是输出却是一堆乱码.现在要做的就是把 Mysql的默认字符编码设置为支持中 ...