uva 10344 23 out of 5(递归+全排列)

这道题好像不是回溯就是简单的递归,全排列一下就ok啦,晚上估计不能好好刷题了

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int cmp(const void *c,const void *d)
{
	return *(int *)c - *(int *)d ;
}
int flag;
int a[5];
void dfs(int cur,int sum)
{
	if(flag == 1)
		return ;
	if(cur == 4 && sum == 23)
	{
		flag = 1;
		return ;
	}
	if(cur == 4)
		return ;
	for(int i=0; i<3; i++)
	{
		if(i == 0)
			dfs(cur+1,sum + a[cur+1]);
		else if(i == 1)
			dfs(cur+1,sum - a[cur+1]);
		else
			dfs(cur+1,sum * a[cur+1]);
	}
	return ;
}
int main()
{
	while(scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4]),a[0]||a[1]||a[2]||a[3]||a[4])
	{
		qsort(a,5,sizeof(a[0]),cmp);
		flag = 0;
		do
		{
			dfs(0,a[0]);
		}while(next_permutation(a,a+5));
		if(flag)
			puts("Possible");
		else
			puts("Impossible");
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 15:46:10

uva 10344 23 out of 5(递归+全排列)的相关文章

uva 10344 23 out of 5 (DFS)

uva 10344 23 out of 5 Your task is to write a program that can decide whether you can find an arithmetic expression consisting of five given numbers (1<=i<=5) that will yield the value 23. For this problem we will only consider arithmetic expression

UVa 10344 - 23 out of 5

题目:给你五个数字,在他们中间加上'+','-','*',构成结果23,问能否成功. 分析:搜索,24点类似物. 首先,求出五个数的全排列: 然后,按顺序枚举三种运算,计算结果,判断即可. 说明:注意优先级,左边的高. #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int data[5],save[5],used[5],buf[5]; int P[120][5]

递归全排列(C#)

递归全排列(C#): static int[] xx=new int[4]; static void Main(string[] args) { printP(4, xx, 0); } static void printP(int n,int [] A,int cur) { int i, j; if (cur == n) { for (i = 0; i < n; i++) Console.Write(A[i]); Console.WriteLine(); } else for (i = 1; i

uva 10795 - A Different Task (递归+状态转移)

题目链接:uva 10795 - A Different Task 思路来源于:点击打开链接 题意: 新汉若塔问题,有n个盘子,放在3个盘子上,给你一个初始状态和一个结束状态,问你最小步数怎样到达. 思路: 递归+状态转移,直接从初态到末态好像不是那么好办,对最大的一块n,首先肯定要把他放在末态的位置上,假设开始在1号位置,要放到3号位置,那么必须先到达这个状态s:1~n-1必须都从大到小放在2上面,然后放n,然后将1~n-1转移到末态,由对称性,也即可以变为末态转移到状态s,那么处理起来就可以

UVa 10344 算23点

题意:有5个数,3种运算符:加.减.乘,用全部5个数,和4个运算符,构成一个表达式,使得值为23,这里没有运算符的优先级,全部是从左往右算.是可以这么理解,题目给的是从左到右依次打了括号. 思路:这里是对表达式的位置进行dfs.可以看到第0位是数字,第1位是运算符,依次则,偶数位是数字,奇数位是运算符.dfs中把当前位置cur分为奇偶分别处理.偶数位置时,则对数字进行枚举,并计算当前表达式的值,注意dfs之后的恢复:奇数位置时,枚举三种运算符.对比可以发现,枚举数字时,由于数字只能出现一次,所以

Num 33 : 函数递归 [ 全排列 ]

数学上的全排列问题: 给定m个数,可以排列成n位数的所有情况: 例:3 个数 ( 1,2,3 ) 排列成两位数[ 含有重复数字 ]有: 11,12 ,13,21,22,23,31,32,33: 例:2个数( 1,2 ) 排列成三位数: 111, 112, 121, 122, 211, 212, 221, 222: 由上易找到规律:         对于 n 位 m 个要求的数 [ 不妨设为1,2,3的 2位数 ],我们只需从最高位开始,依次冠以第一个数( 11 );         之后保持高位

python非递归全排列

刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位置插入,生成n+1个新的全排列.因为Python切割数组或者字符串,以及合并比较方便,所以,程序会节省很多代码. 1 def getArrayInsertCharToStr(STR,CHAR): 2 arr =[] 3 s_len = len(STR) 4 index =0 5 while inde

sicily 1198. Substring (递归全排列+排序)

DescriptionDr lee cuts a string S into N pieces,s[1],…,s[N]. Now, Dr lee gives you these N sub-strings: s[1],…s[N]. There might be several possibilities that the string S could be. For example, if Dr. lee gives you three sub-strings {“a”,“ab”,”ac”},

【UVA】10651-Pebble Solitaire(直接递归或者记忆化)

不知道这个题UVA的数据是怎么的,用2个方法交了,第一次直接递归,第二次记忆化剪枝,时间竟然一样!? 直接郁闷了,简单的二进制表示状态和二进制运算. 14145176 10651 Pebble Solitaire Accepted C++ 0.009 2014-09-04 09:18:21 #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<m