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

运行结果:

6

5

3

2

4

3

1

输出结果:

3 4

1 3 3

1 2 4

最新文章

  1. MVC @Html.TextBoxFor 格式化
  2. js原型基础
  3. 使用 CXF 做 webservice 简单例子
  4. JavaIO流文件的操作总结
  5. 配置git密钥,然后新建仓库
  6. FZU 2082 过路费
  7. Scala学习笔记--特质trait
  8. “Zhuang.Data”轻型数据库访问框架(一)开篇介绍
  9. CF R303 div2 C. Woodcutters
  10. AIR使用文件对象操作文件和目录
  11. Java异常的性能分析
  12. JavaWeb 乱码问题终极解决方案!
  13. Android WebView 缓存
  14. 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)
  15. Canvas-line.html
  16. 第三个spring冲刺第9天
  17. class.forName的作用?
  18. 厉害了,他用PS不是P照片而是……
  19. c/c++ 函数说明以及技巧总结
  20. Linux C ftruncate 函数清空文件注意事项(要使用 lseek 重置偏移量)

热门文章

  1. JAVA实现拼手气红包算法
  2. 关于redis,你需要了解的几点!
  3. 数据库当中删除数据后主键id不连续的问题
  4. 5、打断点(bpu)
  5. 《机器学习_07_01_svm_硬间隔支持向量机与SMO》
  6. python3.x 基础四:json与pickple
  7. MySQL slave状态之Seconds_Behind_Master zz
  8. Windows Terminal安装并美化
  9. Mac下搭建atx2环境
  10. HTML开发实例-简单相亲网站开发(主体为table)