HJ41 称砝码

145 阅读3分钟

HJ41 称砝码

原题:

描述

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

注:

称重重量包括 0

数据范围:每组输入数据满足 1≤n≤10 1≤n≤10 , 1≤mi≤2000 1≤m**i≤2000 , 1≤xi≤10 1≤x**i≤10

输入描述:

对于每组测试数据: 第一行:n --- 砝码的种数(范围[1,10]) 第二行:m1 m2 m3 ... mn --- 每种砝码的重量(范围[1,2000]) 第三行:x1 x2 x3 .... xn --- 每种砝码对应的数量(范围[1,10])

输出描述:

利用给定的砝码可以称出的不同的重量数。

示例:

输入:

 2
 1 2
 2 1

输出:

 5

说明:

 可以表示出0,1,2,3,4五种重量。 

代码&思路:

const rl = require("readline").createInterface({input: process.stdin})

const iter = rl[Symbol.asyncIterator]()

const readline = async () => (await iter.next()).value


void async function() {


// 思路:

// 1,拿到砝码种类的数组,拿到每种砝码对应的数量大数组;(这两个数组一一对应)

// 2,我们先遍历第一个数组,也就是先遍历砝码的种类。拿到第一号砝码后,我们查看一号砝码有多少个,比如有 3 个,我们先拿一个一号砝码,去加集合种的每个值得到一个新值,把新值添加到集合中(集合代表的就是之前那么多放砝码的组合的称量值),然后再拿两个一号砝码,重复上述,再拿三个一号砝码重复上述步骤。

// 3,便利完一号砝码的数量后,我们取二号砝码,再取二号砝码的个数,重复步骤2.

// 这样就存在一种情况,我们拿2个三号砝码去加集合中某个值,假设这个值代表的是单独放2个一号砝码,那么我们相加后的结果就是 放2个三号砝码和2个一号砝码能称多重;把这个值放入集合中,当我们拿4个五号砝码加刚才放入集合中的值的时候,意思就是,2个一号砝码、2个三号砝码和4个五号砝码能称多重。

  


// 哥们思路描述的不是多好,不好理解的话多找找其他的看看。

  


// write here

let special = new Set([0]) // 保存的是所有可能的重量

let oneMax = 0 // 临时变量

let w = 0 // 临时变量 保存的是每种砝码的重量

let n = 0 // 临时变量,保存的是每种砝码对应的数量

let specialArr = [] // 临时变量,保存的是 special 集合转变成数组的状态

  


let types = await readline()

let weight = await readline()

let num = await readline()

types = parseInt(types.trim())

weight = weight.trim().split(' ').map(v => parseInt(v))

num = num.trim().split(' ').map(v => parseInt(v))

weight.forEach((el, index) => {

    specialArr = [...special]

    w = el

    n = num[index]

    for(let p=1; p<=n; p++) {

        oneMax = w * p

        for(let k of specialArr) {

            special.add(oneMax + k)

        }

    }

})

console.log(special.size);

}()