无优先级运算 回溯 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;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值