算法——求礼物的重量集合(美图在线笔试算法第二题)

题目概述:

小明给小红准备了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]);
			}

		}
		
	}	

}

 

    原文作者:算法
    原文地址: https://www.twblogs.net/a/5bd3bf962b717778ac20c9a8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞