HJ41 称砝码(java详解)

  • 称砝码:
    现有一组砝码,重量互不相等,分别为m1,m2,m3…mn;
    每种砝码对应的数量为x1,x2,x3…xn。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。

    *****注:称重重量包括0

  • 解题关键:
    【意识到迭代逻辑,n个砝码能够称重的重量数一定是基于n-1个砝码称重数的基础上的】
    利用集合去重的性质,用set缓存能得到的称重重量,以示例为例,先在集合里面添加0,
    当第一个砝码进来的时候;
    {0} 变成 {0,0+1} -> {0,1}
    当第二个砝码进来之后;
    {0,1} 变成 {0,1,0+1,1+1} --> {0,1,2}
    当第三个砝码进来之后;
    {0,1,2} 变成{0,1,2,0+2,1+2,2+2} —> {0,1,2,3,4}
    最终set集合中的元素个数即为能称出的重量种数。

  • 示例:
    输入:
    2
    1 2
    2 1
    输出:
    5

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        int[] weight=new int[n];
        int[] index=new int[n];
        for(int i=0;i<n;i++){
            weight[i]=in.nextInt();
        }
        for(int i=0;i<n;i++){
            index[i]=in.nextInt();
        }
        Set<Integer> set=new TreeSet<>();
        set.add(0);//初始值设个0,刚开始set里面没有数据,设个0,跟其他的数据好加起来
        for(int i=0;i<n;i++){
            ArrayList<Integer> list=new ArrayList<>(set);
            for(int j=0;j<=index[i];j++){//这里注意砝码数量是可以等于index[i]的
                for(int k=0;k<list.size();k++){
                    int wweight=weight[i]*j;//假设种类i砝码有j个,从砝码数量j=0加至j=index[i]
                    int setweight=list.get(k);//遍历set中全部的数量,加上当前i种类,j个砝码的重量.
                    int sum=wweight+setweight;
                    set.add(sum);
                }
            }
        }
        System.out.print(set.size());
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值