• 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

  • 相关阅读:
    Activity.startManagingCursor方法
    android SQLite使用SQLiteOpenHelper类对数据库进行操作
    Android类参考---SQLiteOpenHelper
    使用SQLiteOpenHelper类对数据库简单操作
    dom4j 最常用最简单的用法(转)
    setContentView()与LayoutInflater.inflate()作用
    Android listview与adapter用法
    ListView属性及divider设置分割线
    android布局属性详解
    Android layout属性之gravity和layout_gravity
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947200.html
Copyright © 2020-2023  润新知