某财务部门结账时发现总金额不对头。很可能是从明细上漏掉了某1笔或几笔。如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或几笔吗?
如果有多种可能,则输出所有可能的情况。
我们规定:用户输入的第一行是:有错的总金额。
接下来是一个整数n,表示下面将要输入的明细账目的条数。
再接下来是n行整数,分别表示每笔账目的金额。
要求程序输出:所有可能漏掉的金额组合。每个情况1行。金额按照从小到大排列,中间用空格分开。
比如:
用户输入:
6
5
3
2
4
3
1
表明:有错的总金额是6;明细共有5笔。
此时,程序应该输出:
1 3 3
1 2 4
3 4
如果有多种可能,则输出所有可能的情况。
我们规定:用户输入的第一行是:有错的总金额。
接下来是一个整数n,表示下面将要输入的明细账目的条数。
再接下来是n行整数,分别表示每笔账目的金额。
要求程序输出:所有可能漏掉的金额组合。每个情况1行。金额按照从小到大排列,中间用空格分开。
比如:
用户输入:
6
5
3
2
4
3
1
表明:有错的总金额是6;明细共有5笔。
此时,程序应该输出:
1 3 3
1 2 4
3 4
为了方便,不妨假设所有的金额都是整数;每笔金额不超过1000,金额的明细条数不超过100。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
/**
* 某财务部门结账时发现总金额不对头。很可能是从明细上漏掉了某1笔或几笔。如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或几笔吗?
* 如果有多种可能,则输出所有可能的情况。
* 我们规定:用户输入的第一行是:有错的总金额。
* 接下来是一个整数n,表示下面将要输入的明细账目的条数。
* 再接下来是n行整数,分别表示每笔账目的金额。
* 要求程序输出:所有可能漏掉的金额组合。每个情况1行。金额按照从小到大排列,中间用空格分开。
* 比如:
* 用户输入:
* 6
* 5
* 3
* 2
* 4
* 3
* 1
* 表明:有错的总金额是6;明细共有5笔。此时,程序应该输出:
* 1 3 3
* 1 2 4
* 3 4
* 为了方便,不妨假设所有的金额都是整数;每笔金额不超过1000,金额的明细条数不超过100。
*
*/
public class WrongMoney {
static int[] tag;
static int[] arr;
static int sum;
static int n;
static ArrayList<String> al=new ArrayList<String>();
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
sum=input.nextInt();
n=input.nextInt();
arr=new int[n];
tag=new int[n];
for (int i = 0; i < n; i++) {
arr[i]=input.nextInt();
}
Arrays.sort(arr);
input.close();
for (int i = 0; i < Math.pow(2, n)-1; i++) {
computer();
if(getSum()==sum&&isOk()){
printf();
}
}
}
/*
* 模仿2进制 得出所有组合的可能
*/
public static void computer(){
tag[0]++;
for (int i = 0; i < tag.length; i++) {
if(tag[i]==1){
break;
}
if(tag[i]==2){
tag[i]=0;
tag[i+1]++;
}
}
}
/*
* 求和
*/
public static int getSum(){
int sum=0;
for (int i = 0; i < arr.length; i++) {
if(tag[i]==0){
sum+=arr[i];
}
}
return sum;
}
/*
* 打印
*/
public static void printf(){
for (int i = 0; i < arr.length; i++) {
if(tag[i]==1){
System.out.print(arr[i]+" ");
}
}
System.out.println();
}
/*
* 判断是否已经存在
*/
public static boolean isOk(){
String t="";
for (int i = 0; i < arr.length; i++) {
if(tag[i]==1){
t+=String.valueOf(arr[i]);
}
}
if(al.contains(t)){
return false;
}else{
al.add(t);
return true;
}
}
}