• 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

  • 相关阅读:
    java-抽象类
    java-接口
    java-面向对象总结
    java-单例设计模式
    java数组
    .Net框架整理
    PHP结合memcacheq消息队列解决并发问题
    浅谈DDos攻击
    PHP+ffmpeg+nginx的配置实现视频转码(转)
    使用Nginx的X-Accel-Redirect实现大文件下载
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947199.html
Copyright © 2020-2023  润新知