2024华为OD试题及答案-A007-称砝码

题目描述

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

输入描述

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

输出描述

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

备注

数据范围:每组输入数据满足:

  • 1 ≤ n ≤ 10
  • 1 ≤ mi ≤ 2000
  • 1 ≤ xi ≤ 10

用例
输入2
1 2
2 1
输出5
说明可以表示出0,1,2,3,4五种重量。

问题解析

我们有多种砝码,每种砝码的重量和数量不同,需要计算这些砝码能够称出的不同重量的数目。问题可以看作一个变种的背包问题:给定几种砝码和它们的数量,计算可以称出的所有不同重量。

输入描述

  1. 第一行:砝码的种数 n (1 ≤ n ≤ 10)
  2. 第二行:每种砝码的重量 m1, m2, ..., mn (1 ≤ mi ≤ 2000)
  3. 第三行:每种砝码的数量 x1, x2, ..., xn (1 ≤ xi ≤ 10)

输出描述

输出可以称出的不同重量数。

思路分析

  1. 使用一个集合来存储可以称出的所有不同重量。
  2. 初始化集合为 {0},表示不使用任何砝码时的重量。
  3. 对每种砝码的每个数量进行遍历,计算并加入新的重量到集合中。
  4. 最终集合的大小即为可以称出的不同重量数。

C++ 实现

以下是实现该逻辑的 C++ 代码:

#include <iostream>
#include <vector>
#include <set>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> weights(n);
    vector<int> counts(n);

    for (int i = 0; i < n; ++i) {
        cin >> weights[i];
    }

    for (int i = 0; i < n; ++i) {
        cin >> counts[i];
    }

    set<int> possible_weights;
    possible_weights.insert(0); // 初始重量为0

    for (int i = 0; i < n; ++i) {
        vector<int> current_weights(possible_weights.begin(), possible_weights.end());
        for (int count = 1; count <= counts[i]; ++count) {
            for (int weight : current_weights) {
                possible_weights.insert(weight + weights[i] * count);
            }
        }
    }

    cout << possible_weights.size() << endl;

    return 0;
}

代码说明

  1. 读取输入:分别读取砝码种数、每种砝码的重量和数量。
  2. 使用集合存储不同重量:初始化集合 possible_weights,并将初始重量 0 放入集合。
  3. 计算所有可能的重量
    • 对每种砝码,计算其每个数量可以称出的重量。
    • 将新计算出的重量加入集合。
  4. 输出结果:集合的大小即为可以称出的不同重量数。

输入输出示例

  • 输入:
2
12 2
1 1
  • 输出:
5

该程序能够根据输入的砝码重量和数量正确计算并输出可以称出的不同重量数。

Python 实现

def main():
    n = int(input().strip())

    weights = list(map(int, input().strip().split()))
    counts = list(map(int, input().strip().split()))

    possible_weights = set()
    possible_weights.add(0)  # 初始重量为0

    for i in range(n):
        current_weights = list(possible_weights)
        for count in range(1, counts[i] + 1):
            for weight in current_weights:
                possible_weights.add(weight + weights[i] * count)

    print(len(possible_weights))

if __name__ == "__main__":
    main()

代码说明

  1. 读取输入:分别读取砝码种数、每种砝码的重量和数量。
  2. 使用集合存储不同重量:初始化集合 possible_weights,并将初始重量 0 放入集合。
  3. 计算所有可能的重量
    • 对每种砝码,计算其每个数量可以称出的重量。
    • 将新计算出的重量加入集合。
  4. 输出结果:集合的大小即为可以称出的不同重量数。

使用示例

运行程序时,将按照下述步骤操作:

  1. 输入砝码的种数 n
  2. 输入每种砝码的重量 weights
  3. 输入每种砝码的数量 counts
  4. 程序将输出可以称出的不同重量数。

示例输入:

2
12 2
1 1

示例输出:

5

该程序能够根据输入的砝码重量和数量正确计算并输出可以称出的不同重量数。

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值