题目描述
现有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五种重量。 |
问题解析
我们有多种砝码,每种砝码的重量和数量不同,需要计算这些砝码能够称出的不同重量的数目。问题可以看作一个变种的背包问题:给定几种砝码和它们的数量,计算可以称出的所有不同重量。
输入描述
- 第一行:砝码的种数 n (1 ≤ n ≤ 10)
- 第二行:每种砝码的重量 m1, m2, ..., mn (1 ≤ mi ≤ 2000)
- 第三行:每种砝码的数量 x1, x2, ..., xn (1 ≤ xi ≤ 10)
输出描述
输出可以称出的不同重量数。
思路分析
- 使用一个集合来存储可以称出的所有不同重量。
- 初始化集合为
{0}
,表示不使用任何砝码时的重量。 - 对每种砝码的每个数量进行遍历,计算并加入新的重量到集合中。
- 最终集合的大小即为可以称出的不同重量数。
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;
}
代码说明
- 读取输入:分别读取砝码种数、每种砝码的重量和数量。
- 使用集合存储不同重量:初始化集合
possible_weights
,并将初始重量0
放入集合。 - 计算所有可能的重量:
- 对每种砝码,计算其每个数量可以称出的重量。
- 将新计算出的重量加入集合。
- 输出结果:集合的大小即为可以称出的不同重量数。
输入输出示例
- 输入:
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()
代码说明
- 读取输入:分别读取砝码种数、每种砝码的重量和数量。
- 使用集合存储不同重量:初始化集合
possible_weights
,并将初始重量0
放入集合。 - 计算所有可能的重量:
- 对每种砝码,计算其每个数量可以称出的重量。
- 将新计算出的重量加入集合。
- 输出结果:集合的大小即为可以称出的不同重量数。
使用示例
运行程序时,将按照下述步骤操作:
- 输入砝码的种数
n
。 - 输入每种砝码的重量
weights
。 - 输入每种砝码的数量
counts
。 - 程序将输出可以称出的不同重量数。
示例输入:
2
12 2
1 1
示例输出:
5
该程序能够根据输入的砝码重量和数量正确计算并输出可以称出的不同重量数。