题解 | #称砝码#

称砝码

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

思路:

  1. 计算砝码的总重量max,剩余表示的重量不会大于max
  2. 申请max+1的空间,判断剩余的重量是否有表示不到的,需要--
#include <stdio.h>

int main()
{
    int n = 0;
    int max = 0;    //表示最大重量
    scanf("%d", &n);  //砝码的种数
    int weight[n];    //重量
    int num[n];       //数量
    memset(weight, 0, n*sizeof(int));
    memset(num, 0, n*sizeof(int));
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &weight[i]);
        //printf("weight[%d] = [%d]\n", i, weight[i]);
    }
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &num[i]);
        //printf("num[%d] = [%d]\n", i, num[i]);
    }
    for(int i = 0; i < n; i++)    //得到最大重量
    {
        max += (weight[i] * num[i]);
    }
    //printf("max = [%d]\n", max);
    int map[max+1];
    memset(map, 0, (max+1)*sizeof(int));
    map[0] = 1;    //0也是重量
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < num[i]; j++)
        {
            for(int k = max-1; k >= 0; k--)
            {
                if(map[k])
                {
                    map[k+weight[i]] = 1;
                    //printf("[%d : %d : %d : %d]\n", i, j, k,k+weight[i]);
                }
            }
        }
    }
    int count = 0;
    for(int i = 0; i < max+1; i++)
    {
        if(map[i])
        {
            count++;
        }
    }
    printf("%d\n", count);
    return 0;
}
全部评论

相关推荐

10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
7 1 评论
分享
牛客网
牛客企业服务