题解 | #称砝码#

称砝码

https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c

#include <stdio.h>
#include<string.h>

int main() {
    int n;
    scanf("%d\n", &n);
    int m[12] = {0};//输入数组放大一些一边测试
    for (int i = 1; i <= n; i++) {
        scanf("%d", &m[i]);
    }
    int num[12] = {0},k = 0;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &num[i]);
        k = k+num[i]*m[i];
    }

    int dp[12][200000];//dp[砝码种类][总质量]
    for (int i = 0; i<=n; i++) {
        dp[i][0] = 1;//不放砝码算一种摆法
    }

    for (int i = 1; i<=n; i++) {
        for (int j = 1; j <= k; j++) {
            if (dp[i-1][j] == 1) {
                dp[i][j] = 1;//如果只有一种砝码的情况能摆出这个质量,那么再加一种也能摆出这个质量(加的那种不上称)
                continue;
            }
            for (int x = 1; x<=num[i]; x++) {
                if (j>=x*m[i]) {//判断能不能再加一个当前编号的砝码
                    if (dp[i-1][j-x*m[i]] == 1) {
                        dp[i][j] = 1;
                        break;
                    }
                }
            }
        }
    }

   
    int kinds=0;
    for(int i=0;i<=k;i++)
    {
        kinds+=dp[n][i]; //只遍历dp砝码数量为n的数组,加出值量种类数
    }
    printf("%d\n",kinds);
     
    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务