描述
对于给定的 n 种砝码,重量互不相等,依次为 m1,m2,…,mn ,数量依次为 x1,x2,…,xn ,
现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。特别地,称重重量包括 0 。
输入描述:
第一行输入一个整数 n(1≦n≦10) 代表砝码的个数。
第二行输入 n 个整数 m1,m2,…,mn(1≦mi≦2000) 代表每种砝码的重量。
第三行输入 n 个整数 x1,x2,…,xn(1≦xi≦10) 代表每种砝码的数量。
输出描述:
输出一个整数,代表利用给定的砝码可以称出的不同的重量数。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
const n = parseInt(await readline()); // 砝码种类数
const m = (await readline()).split(" ").map(Number); // 每种砝码的重量
const x = (await readline()).split(" ").map(Number); // 每种砝码的数量
// 初始化 dp 集合
const dp = new Set();
dp.add(0); // 初始状态,重量为 0
for (let i = 0; i < n; i++) {
const weight = m[i]; // 当前砝码的重量
const count = x[i]; // 当前砝码的数量
const currentDp = Array.from(dp); // 当前 dp 集合的快照
for (let w of currentDp) {
for (let k = 1; k < count + 1; k++) {
dp.add(w + k * weight);
}
}
}
console.log(dp.size)
})();