解题报告——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. PHP发送和接收POST数据

    1. 发送post数据 $data = '{ "id": "17999030", "method": "sayHello" ...

  2. php程序员绝不能违背的安全铁则

    作为PHP程序员,特别是新手,对于互联网的险恶总是知道的太少,对于外部的入侵有很多时候是素手无策的,他们根本不知道黑客是如何入侵的.提交入侵.上传漏洞.sql 注入.跨脚本攻击等等.作为最基本的防范你 ...

  3. Leetcode: Rearrange String k Distance Apart

    Given a non-empty string str and an integer k, rearrange the string such that the same characters ar ...

  4. ANE 从入门到精通 --- 使用R* 访问资源

    在AIR4.0版本之前,ANE内无法使用R*,操作资源仅能使用getResourceID(). 对于接SDK来说尤为头疼. 不过4.0以后可以通过在打包时候指定platform.xml来直接使用R*访 ...

  5. C# 提供两种切割圆形图片的方式

    效果: private void Form1_Load(object sender, EventArgs e) { string file =System.IO.Path.Combine(Enviro ...

  6. vue.js 批量删除跟全选,反选效果

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  7. UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  8. JS字符串替换函数:Replace(“字符串1″, “字符串2″),

    JS字符串替换函数:Replace(“字符串1″, “字符串2″), 1.我们都知道JS中字符串替换函数是Replace(“字符串1″, “字符串2″),但是这个函数只能将第一次出现的字符串1替换掉, ...

  9. 夺命雷公狗-----React_native---4---初始化项目

    我们首先在android目录下创建一个apps的文件夹: 然后我们在apps目录下,按住shift键加鼠标右键选择--在此打开命令窗口输入命令初始化项目 然后就是等了................. ...

  10. 推荐!手把手教你使用Git

    推荐!手把手教你使用Git 原文出处: 涂根华的博客   http://blog.jobbole.com/78960/ 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与 ...