题目概述:
小明给小红准备了n份新年礼物,但小明不会告诉小红每件礼物的重量,小明将礼物重量和写成一个子集。让小红猜每个礼物的重量。
例如:输入:整数n 和 一个整数数组sum[2^n-1];整数数组里面包含重量值。
n=3;sum[]={12,6,18,5,17,11,23},sum内容为相加的重量集合(本身不相加);
输出:5,6,12;
解题思路:
集合中所有值都有可能是礼物重量,但最小的数值肯定是其中之一的礼物重量。
先对数组sum升序排列,然后从第一个数值与后面数值相加,如果所得“和”存在与数组中,则将与和相同的数值赋值为0,然后再从第二个非零数值开始同样步骤,最后的到非零数值就是各个礼物的重量。(注意不要本身相加和与零相加)
java程序算法:
package equnaer;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
public class qunaer {
public static void main(String[] args) {
/*Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] nn=new int[(int) (Math.pow(2,n)-1)];
if(n==1) {
System.out.println(nn[0]);
}else {
}*/
int[] nn=new int[] {12,6,18,5,17,11,23};
HashSet<Integer> set=new HashSet<>();
for(int i=0;i<nn.length;i++) {
set.add(nn[i]);
}
Arrays.sort(nn);
for(int x=0;x<nn.length;x++) {
if(nn[x]!=0) {
int temp=nn[x];
for(int i=x+1;i<nn.length;i++) {
if(set.contains(temp+nn[i])&&nn[i]!=0) {
for(int j=0;j<nn.length;j++) {
if(temp+nn[i]==nn[j])
nn[j]=0;
}
}
}
}
}
for(int i=0;i<nn.length;i++) {
if(nn[i]!=0) {
System.out.println(nn[i]);
}
}
}
}