题解 | #称砝码#

称砝码

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;
}
全部评论

相关推荐

对空六翼:你真幸运,碰见这么好的人,不像我,秋招的时候被室友骗进cx了
实习好累,可以辞职全力准...
点赞 评论 收藏
分享
找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
7
1
分享

创作者周榜

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