漏掉的账目明细

来源:互联网 发布:韩国淘宝模特孙允珠 编辑:程序博客网 时间:2024/04/29 00:34

漏掉的账目明细

某财务部门结账时发现总金额不对头。很可能是从明细上漏掉了某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();}}}


0 0