无优先级运算 回溯 Java

 问题描述:

给定n个正整数和4个运算符+,-,*,/,且运算符无优先级,如2+3×5=25。对于任意给定的整数m,试设计一个算 法,用以上给出的n个数和4个运算符,产生整数m,且用的运算次数最少。给出的n个数中每个数最多只能用1次, 但每种运算符可以任意使用 ★ 算法设计:对于给定的n个正整数,设计一个算法,用最少的无优先级运算次数产生 整数m。


 输入: n  m

    在输入: n个数


import java.util.Scanner;

public class WuYouXianJiYunSuan {
	static int n; 			// 数字个数
	static int a[];			// 所给数组
	static int m;			// 结果数字个数
	static int num[];		//当前数字
	static int oper[];      //符号数组 0 1 2 3  + - * /
	static int flag[];		//判断数字的使用
	static int k;           //运算次数
	static String s;        //计算式字符串
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		n = input.nextInt();
		m = input.nextInt();
		num = new int[n];
		oper = new int[n];
		flag = new int[n];
		a = new int[n];
		for (int p = 0; p < n; p++) {
			a[p] = input.nextInt();
		}
		input.close();
		for (k = 0; k < n; k++) {
			if (search(0)) {
				System.out.println(k);
				System.out.println(s);
				return;
			}
		}

		System.out.println("No Solution! \n");

	}

	public static boolean found() {
		int x = num[0];
		for (int i = 0; i < k; i++) {
			if (oper[i] == 0) {
				x += num[i + 1];
			} else if (oper[i] == 1) {
				x -= num[i + 1];
			} else if (oper[i] == 2) {
				x *= num[i + 1];
			} else if (oper[i] == 3) {
				x /= num[i + 1];
			}
		}
		return (x == m);
	}

	public static void getString(){
		s = String.valueOf(num[0]);
		for (int i = 0; i < k; i++) {
			if (oper[i] == 0) {
				s +=("+"+String.valueOf(num[i+1]));
			} else if (oper[i] == 1) {
				s +=("-"+String.valueOf(num[i+1]));
			} else if (oper[i] == 2) {
				s +=("*"+String.valueOf(num[i+1]));
			} else if (oper[i] == 3) {
				s +=("/"+String.valueOf(num[i+1]));
			}
		}
	}
	public static boolean search(int dep) {
		if (dep > k) {
			if (found()) {
				getString();
				System.out.println();
				return true;
			} else {
				return false;
			}

		}
		for (int i = 0; i < n; i++)
			if (flag[i] == 0) {
				num[dep] = a[i];
				flag[i] = 1;
				for (int j = 0; j < 4; j++) {
					oper[dep] = j;
					if (search(dep + 1))
						return true;
				}
				flag[i] = 0;
			}
		return false;
	}

}


  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来解答你的问题。 首先,回溯算法是一种可以解决许多组合优化问题的算法。在无优先级运算问题中,我们需要找到最少的无优先级运算次数,并输出最优无优先级运算表达式。具体的步骤如下: 1. 定义好无优先级运算的操作符集合,例如加号、减号、乘号和除号。 2. 枚举所有可能的无优先级运算表达式,并计算每个表达式的运算次数。 3. 在枚举的过程中,记录下当前最少的运算次数以及对应的最优无优先级运算表达式。 4. 使用回溯算法来遍历所有可能的无优先级运算表达式,同时更新最少的运算次数和对应的最优无优先级运算表达式。 5. 最终输出最少的运算次数以及对应的最优无优先级运算表达式的 C 语言代码和注释。 下面是一份示例代码,供参考: ```c #include <stdio.h> #include <string.h> #define MAX_N 100 #define INF 0x3f3f3f3f char s[MAX_N]; char best_expr[MAX_N]; int best_count = INF; int count_expr(char *expr) { int cnt = 0; int len = strlen(expr); char op = '+'; for (int i = 0; i < len; i++) { if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') { op = expr[i]; } else { if (op == '+' || op == '-') { cnt++; } } } return cnt; } void backtrack(int pos, char *expr, int count) { if (pos == strlen(s)) { int cnt = count_expr(expr); if (cnt < best_count) { best_count = cnt; strcpy(best_expr, expr); } return; } expr[pos * 2] = s[pos]; expr[pos * 2 + 1] = ' '; backtrack(pos + 1, expr, count); if (pos > 0) { expr[pos * 2 - 1] = '+'; backtrack(pos + 1, expr, count + 1); expr[pos * 2 - 1] = '-'; backtrack(pos + 1, expr, count + 1); expr[pos * 2 - 1] = '*'; backtrack(pos + 1, expr, count + 1); expr[pos * 2 - 1] = '/'; backtrack(pos + 1, expr, count + 1); } } int main() { scanf("%s", s); char expr[MAX_N]; memset(expr, ' ', sizeof(expr)); backtrack(0, expr, 0); printf("Least count: %d\n", best_count); printf("Best expr: %s\n", best_expr); return 0; } ``` 以上就是求解无优先级运算问题输出最少无优先级运算次数以及最优无优先级运算表达式的 C 语言代码和注释,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值