称砝码

 

 

public class Demo {
    /*
     * 砝码问题: 现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……xn
     * 现在要用这些砝码去称物体的重量,问能称出多少中不同的重量
     * 输入: int n:n表示有多少组重量不同的砝码,1<=n<=10 int[] weight:表示n组砝码的重量,1<=mi<=10 int[]
     * nums:表示n组砝码的最大数量,1<=xi<=10
     * 输出: 只有一个数据,表示利用给定的砝码可以称出的不同的重量数;非法数据输出-1
     * 注: 称重重量包括0 要对输入数据进行校验
     */
    public static int fama(int n, int[] weight, int[] nums) {
        if (n <= 0 || n > 10 || null == weight || null == nums || weight.length != n
                || nums.length != n) {
            return -1;
        }

        for (int temp : weight) {
            if (temp < 1 || temp > 10) {
                return -1;
            }
        }

        for (int temp : nums) {
            if (temp < 1 || temp > 10) {
                return -1;
            }
        }

        int i;
        HashSet<Integer> set = new HashSet<Integer>();
        set.add(0);
        HashSet<Integer> tempSet = new HashSet<Integer>();
        for (i = 0; i < n;) {
            tempSet.add(weight[i]);
            for (Integer integer : set) {
                tempSet.add(integer + weight[i]);
            }

            set.addAll(tempSet);
            tempSet.clear();
            if (0 == --nums[i]) {
                i++;
            }
        }

        return set.size();
    }
}

 

posted @ 2018-11-13 15:57  牧 天  阅读(340)  评论(0)    收藏  举报