砝码称重问题

  砝码称重问题:设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其质量<=1000g),求出用他们能称出的质量的种类数(不包括质量为0的情况)。

  一、动态规划方法求解

  设dp[1000]数组为标记数组。当dp[i]=0时,表示质量为i的情况,目前没有称出;当dp[i]=1时,表示质量为i的情况已经称出。

  本题目中有多个砝码,我们顺序处理每一个砝码。

  当处理第j个砝码,质量为wj时,有下列推导公式:

                

  完整程序代码如下:

#include<stdio.h>
#include<string.h>
int sum;  ///表示输入的砝码的总质量
int ma[6];  ///六种砝码的个数
int weight[6]={1,2,3,5,10,20};  ///六种砝码的重量
char dp[1001]; ///标记位

void input();   ///输入每个砝码的数量,并求出所有砝码的总质量sum
void exeDP();
void output();  ///判断标记为1的数量,并输出

int main()
{
    memset(dp,0,sizeof(dp));
    input();
    exeDP();
    output();
    return 0;
}

void input()
{
    int i;
    sum=0;
    for(i=0;i<6;i++)
    {
        scanf("%d",&ma[i]);
        sum=sum+(ma[i]*weight[i]);
    }
}

void exeDP()
{
    int i,j,z;
    dp[0]=1;
    for(i=0;i<6;i++)    ///六种砝码
    {
        for(j=0;j<ma[i];j++)    ///每种砝码的个数
        {
            for(z=sum;z>=weight[i];z--) ///判断每种质量是否可以被称出
            {
                if(dp[z-weight[i]]==1)
                    dp[z]=1;
            }
        }
    }
}

void output()
{
    int i,time=0;
    for(i=1;i<=sum;i++)
    {
        if(dp[i]==1)    ///若能被称出,则计数
            time++;
    }
    printf("%d",time);
}

  二、母函数求解

  设输入的质量为w的砝码n个,则可以用母函数表示为:

  针对本题目,例如输入六种砝码(1g,2g,3g,5g,10g,20g)的个数分别为:1,2,2,0,0,1。则有:

  用matlab软件的符号计算有:

>> syms x;
>> f1=(1+x);
>> f2=(1+x^2+x^4);
>> f3=(1+x^3+x^6);
>> f4=(1+x^20);
>> expand(f1*f2*f3*f4)>>ans=x^31 + x^30 + x^29 + 2*x^28 + 2*x^27 + 2*x^26 + 2*x^25 + 2*x^24 + 2*x^23 + x^22 + x^21 + x^20 + x^11 + x^10 + x^9 + 2*x^8 + 2*x^7 + 2*x^6 + 2*x^5 + 2*x^4 + 2*x^3 + x^2 + x + 1

  其中x的指数就是能够称出的质量,可知可以称出的不同质量个数为23个。

时间: 2024-08-10 19:16:42

砝码称重问题的相关文章

1449 砝码称重

1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 现在有好多种砝码,他们的重量是 w0,w1,w2,...  每种各一个.问用这些砝码能不能表示一个重量为m的东西. 样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中. Input 单组测试数据. 第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9). Output 如果能,输出YES,否则输出NO. Input示例

2144 砝码称重 2

2144 砝码称重 2 http://codevs.cn/problem/2144/ 题目描述 Description 有n个砝码,现在要称一个质量为m的物体,请问最少需要挑出几个砝码来称? 注意一个砝码最多只能挑一次 输入描述 Input Description 第一行两个整数n和m,接下来n行每行一个整数表示每个砝码的重量. 输出描述 Output Description 输出选择的砝码的总数k,你的程序必须使得k尽量的小. 样例输入 Sample Input 3 10591 样例输出 Sa

【dp】砝码称重

砝码称重 来源:NOIP1996(提高组)  第四题 [问题描述]     设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000),用他们能称出的重量的种类数. [输入文件]   a1  a2  a3  a4  a5  a6     (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个,中间有空格). [输出文件]   Total=N     (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况). [输入样例]     1 1 0 0 0

HFUT 1354.砝码称重(安徽省2016“京胜杯”程序设计大赛 A)

砝码称重 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 12 Accepted: 10 Description 小明非常喜爱物理,有一天,他对物理实验室中常用的弹簧拉力计产生了兴趣.实验室中有两种质量不同的砝码,小明分别用a个第一种砝码放在弹簧拉力计上和b个第二种砝码放在弹簧拉力计上,假设每增加单位重量的砝码,弹簧拉力计的长度增加1,那么两次称量弹簧拉力计的长度差是多少呢?(假设拉力计不发生非弹性形变) Input 第

砝码称重问题二

题目描述 有一组砝码,重量互不相等,分别为m1.m2.m3……mn:它们可取的最大数量分别为x1.x2.x3……xn. 现要用这些砝码去称物体的重量,问能称出多少种不同的重量. 现在给你两个正整数列表w和n, 列表w中的第i个元素w[i]表示第i个砝码的重量,列表n的第i个元素n[i]表示砝码i的最大数量.  i从0开始                   请你输出不同重量的种数.如:w=[1,2], n=[2,1], 则输出5(分析:共有五种重量:0,1,2,3,4) 解题 参考智力题砝码称重

蓝桥杯——说好的进阶之砝码称重(贪心算法)

5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). 本题目要求编程实现:对用户给定的重量,给出砝码组合方案. 例如: 用户输入: 5 程序输出: 9-3-1 用户输入: 19 程序输出: 27-9+1 要求程序输出的组合总是大数在前小数在后. 可以假设用户的输入的数字符合范围1~121. public static void main(String

51nod 1449 砝码称重 (进制思想)

1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 现在有好多种砝码,他们的重量是 w0,w1,w2,...  每种各一个.问用这些砝码能不能表示一个重量为m的东西. 样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中. Input 单组测试数据. 第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9). Output 如果能,输出YES,否则输出NO.

J - 砝码称重 改自51nod1449

J - 砝码称重 Time Limit: 2000/1000 MS (Java/Others)      Memory Limit: 128000/64000 KB (Java/Others) Submit Status Problem Description 有一个物品和一些已知质量的砝码和天平,问能不能用这些砝码称出这个物品的重量(天平两边都可以放砝码) Input 多样例输入,样例数<=20000 对于每个样例: 第一行输入两个数n,m,表示砝码数量和重物质量,1 ≤ m ≤ 1018 第

wiki 2144 砝码称重 2 STL_map

前言       最近学习C#,不过好在当初考计算机二级学习过C++,刚上手没有对C#感到很恐惧.C#视频也看了几天 了,总感觉不总结一下心里没底,现在跟着我从头走进C#之旅吧.     C#是以后总面向对象的编程语言(OOP),C#是从C和C++派生出来的,主要用于开发可以运行在.NET平台 上的应用程序.随着.NET的发展,C#语言简单.现代.面向对象和类型安全显示了一定的优势.     下面我就介绍一些初学者不太理解的一些东西.   C#有以下突出的特点       (1)语法简洁.不允许

C程序设计的抽象思维-递归过程-砝码称重

[问题] 在狄更斯时代,商人们用砝码和天平来称量商品的重量,如果你只有几个砝码,就只能精确地称出一定的重量.例如,假定只有两个砝码:分别是1kg和3kg.只用1kg的砝码可以称出1kg重量的商品,只用3kg的砝码可以称出3kg重量的商品.1kg和3kg的砝码放在天平同一边可以称出4kg重量的商品,放在不同边可以称出2kg重量的商品.因此利用这两个砝码,我们可以称出重量分别为1.2.3.4kg的商品. 编写一个递归函数: bool IsMeasurable(int target, int weig