uva10400 - Game Show Math(回溯+剪枝)

2024-08-24 04:32

本文主要是介绍uva10400 - Game Show Math(回溯+剪枝),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:uva10400 - Game Show Math(回溯+剪枝)


题目大意:给出N个数,并且给出一个目标数值,要求用上面的数字(全部),并且顺序不能乱,然后用+-*/这些操作,问最终能不能得到目标数值。这里要注意给出的数会在【-32000,32000】之间, 并且要用除法的时候,只有在能整除的时候才能用。并且中间计算结果不能超过【-32000,32000】范围。如果超过这个操作不能做。

解题思路:回溯加剪枝,将每一层计算的结果都保存下来,如果在同一层发现值出现过,并且之前计算发现这样往后是得不到目标值的,那么就可以直接剪掉。

                  这题题意没有读清楚,结果WA了好多遍。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>const int N = 105;
const int M = 70000;
const int maxn = 32000;char op[N];
int num[N];
int n;
int target;
int flag;
char OP[4] = {'*', '-', '+', '/'};
int vis[N][M];void dfs (int k, int sum) {if (k == n - 1) {/*	for (int i = 0; i < n - 1; i++)printf ("%c ", op[i]);printf ("\n");printf ("%d\n", sum);*/if (sum == target)flag = 1;return;}int temp;for (int i = 0; i < 4; i++) {op[k] = OP[i];	switch (OP[i]) {case '+' : temp = sum + num[k + 1];if (abs (temp) > maxn)break;if (vis[k][temp + maxn])break;dfs (k + 1, temp); break;case '-' : temp = sum - num[k + 1];if (abs (temp) > maxn)break;if (vis[k][temp + maxn])break;dfs (k + 1, temp); break;case '/' : if (sum % num[k + 1] == 0) {temp = sum / num[k + 1];if (abs (temp) > maxn)break;if (vis[k][temp + maxn])break;dfs (k + 1, temp); }break;case '*' : temp = sum * num[k + 1];if (abs (temp) > maxn)break;if (vis[k][temp + maxn])break;dfs (k + 1, temp); break;}if (flag)return;else if (abs (temp) <= maxn && !vis[k][temp + maxn])vis[k][temp + maxn] = 1;}
}int main () {int t;scanf ("%d", &t);while (t--) {scanf ("%d", &n);for (int i = 0; i < n; i++)scanf ("%d", &num[i]);scanf ("%d", &target);flag = 0;memset (vis, 0, sizeof (vis));dfs(0, num[0]);
//		printf("%d\n", flag);if (!flag)printf ("NO EXPRESSION\n");else {for (int i = 0; i < n; i++) {if (i == n - 1)printf ("%d=%d\n", num[i], target);elseprintf ("%d%c", num[i], op[i]);}}}return 0;
}


这篇关于uva10400 - Game Show Math(回溯+剪枝)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101451

相关文章

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

hdu1010 奇偶剪枝

恰好t时间到达 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.Arrays;import

fzu 2275 Game KMP

Problem 2275 Game Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number i

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成

07 v-if和v-show使用和区别

划重点: v-ifv-show 小葱拌豆腐 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="

风控系统之指标回溯,历史数据重跑

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview 回顾 默认你已经看过之前那篇风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法。 其中已经介绍了如何利用redis的zset结构完成指标计算,为了方便这篇文章的介绍,还是在正式开始本篇之前回顾一下。 时间窗口 zset

10400 -Game Show Math

这道题的话利用了暴力深搜,尽管给了20S,但是这样还会超时,所以就需要利用回溯进行减枝,因为是DFS,所以用一个数组vis[i][j]记录是否在状态i时候取到过j值,如果取到过的话,那么直接回溯(往后搜索已经没有意义了,之前到达这个状态的时候是无法得到结果的) 还有需要注意的地方就是题目的要求,每一步的结构都在(-32000,32000)之间,所以需要一步判断,如果在这个范围外直接回溯 最后一

165-Stamps【回溯】

回溯 给h和k的意思是在k种邮票中选h个邮票 基本的连续邮资问题 15226160 165 Stamps Accepted C++ 0.062 2015-03-27 07:21:37 #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 2

show命令监控分析mysql实例信息

文章目录 思维导图show 查看数据库实例相关信息SHOW VARIABLES 分析数据库当前变量设置分析连接数据分析线程数分析慢查询变量分析缓存相关分析字符集相关 SHOW STATUS 数据库当前实时状态分析分析连接数据分析线程数分析慢查询分析查询缓存分析排序使用情况分析文件打开数mysql 锁分析 思维导图 show 查看数据库实例相关信息 查看当前实例所有数据库

Python的math库——常用数学函数全解析

文末赠免费精品编程资料~~ 一、math模块简介 math 是 Python 内置的一个标准库,它包含了许多执行复杂数学运算的函数,如三角函数、对数函数、指数函数等。 二、常用函数详解与示例 基本数学运算 math.sqrt(x): 计算平方根。 import math# 计算平方根result = math.sqrt(16)print(result) # 输出 4.0 mat