北京大学 程序设计与算法(二) 递归 算24

算24

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

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

输入

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

输出

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

思路:
n个数算24,必有两个数先算。这两个数算的结果,和剩余n-2个数,就构成了n-1个数求24的问题。

枚举先算的两个数,以及这两个数的运算方式。

边界条件:一个数算24直接报出yes或no

注意:浮点数比较是否相等,不能用==

程序

#include<iostream>

#include<cmath>

using namespace std;

double a[5];

#define EPS 1e-6

bool isZero(double x){

return
fabs(x)<=EPS;

}

bool count24(double a[],int n)

{//用数组 a里的n个数

if(n==1){

cout<<a[0]<<endl;

if(isZero(a[0]-24))

return
true;

else

return
false;

}

double
b[5];

for(int
i=0;i<n-1;++i)

for(int
j=i+1;j<n;++j){//枚举两个数的组合

int
m=0;//还剩下两个数,m=n-2

for(int
k=0;k<n;++k)

if(k!=i&&k!=j)b[m++]=a[k];//把其余数放入b

b[m]=a[i]+a[j];

if(count24(b,m+1))return
true;

b[m]=a[i]-a[j];

if(count24(b,m+1))return
true;

b[m]=a[j]-a[i];

if(count24(b,m+1))return
true;

b[m]=a[j]*a[i];

if(count24(b,m+1))return
true;

if(!isZero(a[j])){

b[m]=a[i]/a[j];

if(count24(b,m+1))

return
true;

}

if(!isZero(a[i])){

b[m]=a[j]/a[i];

if(count24(b,m+1))

return
true;

}

}

return
false;

}

int main(){

for(int
i=0;i<4;i++){cin>>a[i];

}

if(count24(a,4))cout<<"Yes"<<endl;

else
cout<<"no"<<endl;

}

原文地址:https://www.cnblogs.com/Invictus-Gaming/p/12398281.html

时间: 2024-08-29 05:26:37

北京大学 程序设计与算法(二) 递归 算24的相关文章

北京大学-程序设计与算法 专项课程

程序设计与算法专项课程 https://www.coursera.org/specializations/biancheng-suanfa 计算导论 https://www.coursera.org/learn/jisuanji-biancheng C程序设计 https://www.coursera.org/learn/c-chengxu-sheji C++程序设计 https://www.coursera.org/learn/cpp-chengxu-sheji 算法基础 https://ww

北京大学 程序设计与算法(二) 递归 上台阶

用递归将问题分解为规模更小的子问题进行求解 爬楼梯 树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数. 例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共3中方法. 输入 输入包括若干行,每行包含一个正整数N,代表楼梯级数,1<=N<=30输出不同的走法数,每一行输入对应一行 思路: N级台阶的走法=先走一级后,n-1级台阶的走法+先走两级后,n-2级台阶的走法 f(n)=f(n-1)+f(n-2) 边界条件:

北京大学 程序设计与算法(二)递归 放苹果

例题:放苹果 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发?5,1,1和1,5,1是同一种分发. 输入 第一行是测试数据的数目t(0<=t<=20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. 输出 对输入的每组数据M和N,用一行输出相应的K 样例输入 1 7 3 样例输出 8 思路: 设i个苹果放在k个盘子里放法总数是f(I,k),则: k>i时,f(i,k)=f(i,i) k<=i时,总放法=有盘子为空的放

北京大学 程序设计与算法(二)逆波兰表达式

用递归解决递归形式的问题 逆波兰表达式 逆波兰表达式是一种把运算符前置的算数表达式,例如普通的表达式2+3的逆波兰表示法为+2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2+3)*3的逆波兰表示法为*+234.本题求解逆波兰表达式的值,其中运算符包括+-*/四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算符是浮点数 输出 输出为一行,表达式的值. *+11.0 12.0 +24.0 35.0 --à(11.0+12.0)*(24.0+3

北京大学 程序设计与算法(二) 表达式求值

表达式由 项+或者-项 组成 项由 因子*或者/因子 组成 可以连加连减或者连连城连除 因子由 左括号 表达式 右括号组成 #include<iostream> #include<cstring> #include<cstdlib> using namespace std; int factor_value(); int term_value(); int expression_value(); int main() { cout<<expression_v

coursera 北京大学 程序设计与算法 专项课程 完美覆盖

#include <iostream> using namespace std; /*int wanmeifugai(int n){ if(n%2){ return 0; } else if(n==2){ return 3; }else if(n == 0) return 1; else return (2+ 3*3)*wanmeifugai(n-4); }*/ //下面是参考网上的程序 /*思路:引自:http://m.blog.csdn.net/blog/njukingway/204518

爪哇国新游记之二十一----快算24

四张牌,通过四则运算得到24,一个数限用一次,快者为胜. 代码: import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 快算24 * @author heyang * */ public class Caculator{ private double anticipate;// 预期结果 private double op1;// 操作数一

【算法29】速算24

问题描述 题目来源:PAT ds 2-08 给定四个数字a, b, c, d,取值范围为[1, 13]:添加合适的运算符 + , - , * , /, 和括号(, )使得表达式等于24,给出一种可能的表达式方案:如果不可能则返回-1. 例如:输入2, 3, 12, 12, 输出 ((3-2)*12) + 12. 输入5, 5, 5, 2, 输出-1. 问题分析 这个题目似乎没有好的算法,只能暴力搜索. 首先对于所有给个数字进行全排列,总过有$A_4^4 = 24$中排列方式: 然后对于每一种排列

python实现算24的算法

1.介绍 给定4个整数,数字范围在1-13之间,任意使用 + - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24的游戏.本文介绍用Python语言实现的两种方式.2.实现思路 实现输入4个数字的排列组合,这样等于实现了括号的功能,然后使用+ - * /进行组合计算. 第一种使用简写的方式,比第二种更好用. 第二种按一般的实现思路,加有注释,更易看懂. 3.代码实现 3.1 第一种,使用列表的切片操作实现排列组合,使用异常进行下一次循环. # encoding=utf-