题解 | #称砝码#

称砝码

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;
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务