jshzoi
解题报告——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的更多相关文章
随机推荐
- Java 多线程之单例设计模式
转载:https://segmentfault.com/a/1190000007504892 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例.饿汉 ...
- 接入WebSocket记录
为什么用 WebSocket 因为APP里面有个聊天功能,需要服务器主动推数据到APP.HTTP 通信方式只能由客户端主动拉取,服务器不能主动推给客户端,如果有实时的消息,要立刻通知客户端就麻烦了,要 ...
- Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)
一.介绍 随着Swift的逐渐成熟,使用swift开发或者混合开发已经成为了一个趋势,本身苹果公司也十分推荐使用Swift这门新语言.目前Swift已经更新到了3.0,估计没有多久4.0就要出来了.那 ...
- SLP测试记录
个人感觉来说这个游戏对我没有什么吸引力...完全不知道用户需求在哪...是我最不喜欢的一个游戏 不过听制作团队之前的介绍,这应该不算是一个游戏,而是一个游戏练习器?所以从游戏的角度来评判的话感觉有很多 ...
- 手机app开发:浅谈APP登录方式的优劣
手机app开发公司亿合科技要是给你一个机会设计一款APP,你会用什么方式做这个APP的登录模块?根据APP的业务模型的不同会有不同的设计方法.如果是偏内容型的APP,需要优先展示内容给用户,当用户需要 ...
- C# async and await
C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: public class MyClass { public MyClass() { Displa ...
- C#,C++修改vs文件模板,添加自定义代码版权版本信息
简单型的修改类似该路径下的模板文件即可(vs版本或安装路径不同路径可能不同) C#: 模板参数参考https://msdn.microsoft.com/zh-cn/library/eehb4faa.a ...
- 常用的Linux命令
1.如何创建一个目录?mkdir DirectoryName 2.如何进入服务器根目录?ls / 3.如何查看日历?cal 4.如何修改密码?passwd 5.如何查看当前用户信息?whoami 6. ...
- 【MongoDB for Java】Java操作MongoDB
上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...
- C语言回顾-结构体、枚举和文件
1.构造类型 根据已经定义的一个或多个数据类型用构造的方法来定义. 分为:数组.结构体和共用体 2.结构体 struct 结构体名{ 成员列表: }; 1)结构体定义完成以后,计算机不会给结构体分配存 ...