题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
#include <stdio.h>
int main() {
int n;
while(scanf("%d", &n) != EOF) {
int m[n];
for(int i = 0; i < n; i++) {
scanf("%d", &m[i]);
}
int x[n];
for(int i = 0; i < n; i++) {
scanf("%d", &x[i]);
}
// total用来计算我们可以称量的最大重量
int total = 0;
for(int i = 0; i < n; i++) {
// 使用每种砝码的重量乘以数量得到每种砝码最大承重量,再相加
total += m[i] * x[i];
}
// 定义一个数组可以表示某个重量是否称量过,第一个元素为1(代表称量过)
int arr[200001] = {1};
for(int i = 0; i < n; i++) {
// 循环遍历每种砝码
for(int j = 0; j < x[i]; j++) {
// 遍历当前砝码(第i个)的个数x[i]
for(int k = total; k >= 0; k--) {
// 遍历所有的重量
if(arr[k]) {
// 如果遇到称量过的重量(以0为开始),我们将当前的这个砝码的重量也加上去,标记为称量过了
arr[k + m[i]] = 1;
}
}
}
}
int count = 0;
for (int i = 0; i <= total; i++) {
if(arr[i] == 1) {
count++;
}
}
printf("%d\n", count);
return 0;
}
}