• java实现金额组合


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

  • 相关阅读:
    iOS中Zbar二维码扫描的使用
    SOJ 1135. 飞跃原野
    SOJ 1048.Inverso
    SOJ 1219. 新红黑树
    SOJ 1171. The Game of Efil
    SOJ 1180. Pasting Strings
    1215. 脱离地牢
    1317. Sudoku
    SOJ 1119. Factstone Benchmark
    soj 1099. Packing Passengers
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947199.html
Copyright © 2020-2023  润新知