漏掉的账目明细

漏掉的账目明细

某财务部门结账时发现总金额不对头。很可能是从明细上漏掉了某1笔或几笔。

如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或几笔吗?

如果有多种可能,则输出所有可能的情况。

我们规定:用户输入的第一行是:有错的总金额。

接下来是一个整数n,表示下面将要输入的明细账目的条数。

再接下来是n行整数,分别表示每笔账目的金额。

要求程序输出:所有可能漏掉的金额组合。每个情况1行。金额按照从小到大排列,中间用空格分开。

比如:

用户输入:

6

5

3

2

4

3

1

表明:有错的总金额是6;明细共有5笔。

此时,程序应该输出:

1 3 3

1 2 4

3 4

为了方便,不妨假设所有的金额都是整数;每笔金额不超过1000,金额的明细条数不超过100。

package marslin;

import java.util.Arrays;
import java.util.Scanner;
import java.util.Vector;
import java.util.concurrent.PriorityBlockingQueue;
import javax.swing.text.AbstractDocument.BranchElement;

public class 漏掉的账目明细27 {

	public static String elementOfPriorityBlockingQueue(int array[],
			boolean used[]) {
		
		PriorityBlockingQueue<Integer> priorityBlockingQueue = new PriorityBlockingQueue<Integer>();
		for (int i = 0; i < used.length; i++) {
			if (used[i] == true) {
				priorityBlockingQueue.add(array[i]);
			}
		}
		StringBuffer sb = new StringBuffer();
		while (!priorityBlockingQueue.isEmpty()) {
			sb.append(priorityBlockingQueue.poll());
		}
		return sb.toString();
	}

	public static void exeForward(
			PriorityBlockingQueue<String> priorityBlockingQueue, int array[],
			boolean used[], int index, int sum, int tSum) {
		if (sum > tSum) {
			return;
		}
		if (sum == tSum) {
			String string = elementOfPriorityBlockingQueue(array, used);
			if (!priorityBlockingQueue.contains(string)) {
				priorityBlockingQueue.add(string);
			}
			return;
		}
		if (index <= array.length - 1) {
			for (int i = 0; i <= 1; i++) {
				used[index] = (i == 0 ? false : true);
				sum += array[index] * i;
				exeForward(priorityBlockingQueue, array, used, index + 1, sum,
						tSum);
				sum -= array[index] * i;
				used[index] = (i == 1 ? false : true);
			}
		} else {
			return;
		}
	}

	public static void main(String[] args) {
		int tSum;
		int n;
		Vector<Integer> vector = new Vector<Integer>();
		Scanner scanner = new Scanner(System.in);
		PriorityBlockingQueue<String> priorityBlockingQueue = new PriorityBlockingQueue<String>();
		tSum = scanner.nextInt();
		n = scanner.nextInt();
		int array[] = new int[n];
		boolean used[] = new boolean[n];
		tSum *=(-1);
		for (int i = 0; i < n; i++) {
			array[i] = scanner.nextInt();
			tSum += array[i];
		}
		exeForward(priorityBlockingQueue, array, used, 0, 0, tSum);
		while (!priorityBlockingQueue.isEmpty()) {
			String string = priorityBlockingQueue.poll();
			for (int i = 0; i < string.length(); i++) {
				System.out.print(string.charAt(i));
				if (i != string.length() - 1) {
					System.out.print(" ");
				}
			}
			System.out.println();
		}
	}
}


你可能感兴趣的:(数据结构,算法,蓝桥杯)