题解 | #称砝码#
称砝码
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; } }