秤砝码

砝码称重问题求解:动态规划与母函数方法

  砝码称重问题:设有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-10-02 05:51:39

秤砝码的相关文章

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

砝码问题之二(完全背包问题)

有一组砝码,重量互不相等,分别为m1.m2.m3……mn:每种砝码的数量有无限个. 现要用这些砝码去称物体的重量,给你一个重量n,请你判断有给定的砝码能否称出重量n. 现在给你一个正整数列表w和一个正整数n,列表w中的第i个元素w[i]表示第i种砝码的重量, n表示要你判断的重量.如果给定砝码能称出重量n,输出Yes,否则输出No. 例如,w=[2,5,11], n=9,则输出Yes(取两个2,一个5). w = [2, 5, 11] n = 9 S = [-1 for i in xrange(

称砝码

现有一组砝码,重量互不相等,分别为m1.m2……mn:他们可取的最大数量分别为x1.x2……xn.现在要用这些砝码去称物体的重量,问能称出多少中不同的重量. 1 import java.util.HashSet; 2 import java.util.Scanner; 3 import java.util.Set; 4 5 6 public class Main { 7 8 public static void main(String[] args) throws Exception 9 { 1

CODEVS2144 砝码称重2 (哈希表)

由于m很大,所以不能使用DP. 注意到n<30,直接暴力2^n会TLE. 所以,将砝码平均分成两份,对一份进行一次暴力,用哈希表存下可能的结果. 对下一份再进行一次暴力,在哈希表中搜索剩余的砝码重量是否存在,若存在则更新答案. 输出最小答案即可. Program CODEVS2144; const maxn=100; maxh=100007; var a:array[0..maxn] of longint; n,i,ans:longint; m:int64; h:array[0..maxh,1.

【算法题】用最少的砝码称出1到100克的物品

题目描述: 给定一个天平,用最少的砝码称出1到100克的物品,砝码重量任选 假设物品放在右边,砝码可以放在左边或者右边,那么有:放在左边砝码的重量 = 放在右边砝码的重量 + 物品的重量,即 放在左边砝码的重量 - 放在右边砝码的重量 = 物品的重量. 假设砝码放在左边用'+'表示,放在右边用'-'表示.那么容易知道∑±ai(ai取'+'.'-'或不取,三种情况)表示所有可能的情况. 给出一种方案:1.3.9.27.81(想想为什么底数取3???) 容易知道4个砝码∑±ai最多有34 = 81中

【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) 解题 参考智力题砝码称重