砝码称重问题

砝码称重

问题描述

你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1,W2,⋅⋅⋅,WN。

请你计算一共可以称出多少种不同的正整数重量?

注意砝码可以放在天平两边。

输入格式

输入的第一行包含一个整数 N。

第二行包含 N 个整数:W1,W2,W3,⋅⋅⋅,WN。

输出格式

输出一个整数代表答案。

数据范围

对于 50% 的评测用例,1≤N≤15

对于所有评测用例,1≤N≤100,N 个砝码总重不超过 100000

输入样例:

3

1 4 6

输出样例:

10

样例解释

能称出的 10 种重量是:1、2、3、4、5、6、7、9、10、11。
1 = 1;

2 = 6 − 4 (天平一边放 6,另一边放 4);

3 = 4 − 1;

4 = 4;

5 = 6 − 1;

6 = 6;

7 = 1 + 6;

9 = 4 + 6 − 1;

10 = 4 + 6;

11 = 1 + 4 + 6。


题解

这里使用闫式dp分析法,将分析过程分为状态表示和状态计算两个过程

状态表示

集合:
只考虑前i个物品,能得出的j种方案的集合

属性:
是否为空

这里属性也可设置为数量,设置为数量也更好理解些,至于为什么用bool来进行判断,后面会进行解释


状态计算

我们可以将f(i,j)集合分为三个子集,第一个为不选i个物品,第二个为左边选i个物品,第三个为右边选i个物品

所得状态方程如下:

不选:

f[i - 1][j]

左边:

f[i - 1][abs(j - w[i])]

右边:

f[i - 1][j + w[i]]

选左边的方程由实际含义可得知 f[i][j - w[i]] = f[i][w[i] - j] = f[i][ abs([j] - w[i]) ] 故可以利用取绝对值避免数组下标为负数的情况。


状态转移方程

从上可以得到我们的状态转移方程为

f[i][j] = f[i - 1][j] || f[i - 1][j + w[i]] || f[i - 1][abs(j - w[i])]

判断前i个数不选或选左右边后得到的值,如果j对第i个数的权值w[i]进行选择后能与 上一个数i-1进行选择后 的值进行匹配,则该j值为true

如果我们将状态表示的属性设为数量,那么此处的状态转移方程应为:

f[i][j] = f[i - 1][j] + f[i - 1][j + w[i]] + f[i - 1][abs(j - w[i])]

这样到最后其实我们也是判断 选前i个值第j个值是否为0,那么我们不如从一开始就将属性设为bool值,只要不选,和选左右边这三个状态有一个状态是合法的状态,那么f[i][j]就是合法的,即为true


详细代码(C++)

#include <iostream>

using namespace std;
const int N = 110, M = 2e5 + 10;    //假设sum=1e5,加上w[i]是会大于1e5的,故取2e5+10较妥当
int n,sum,w[N];
int f[N][M];

int main()
{
    cin >> n;
    for (int i = 1;i <= n; i++)
    {
        cin >> w[i];
        sum += w[i];
    }
    f[0][0] = true;     
    for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j <= sum; j++)
        {
            f[i][j] = f[i - 1][j] || f[i - 1][j + w[i]] || f[i - 1][abs(j - w[i])];
        }
    }
    int ans = 0;
    for(int i = 1; i <= sum; i++)   //0不作为选取方案,故从1开始遍历
    {
        if(f[n][i]) ans++;
    }
    cout << ans;
    return 0;
}
  • 38
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
现货供应西门子称重MS模块7MH4930超低价 7MH4930-0AA01,MS称重模块,西门子,诚通达 SIWAREX MS是一种多用途称重模块,适用于所有简单称重与测力任务。该紧凑型模块可以简便的方式安装到 SIMATIC S7-200自动化系统之中。可直接在 SIMATIC-CPU中存取当前重量数据,无需添加其它接口。 SIWAREX MS具有下列主要优点: .采用标准化安装技术,可在SIMATIC S7-200系统中连续通讯 .可使用STEP 7-Micro/WIN进行统一设计 .重量以及力的测量内部分辨率为65000个分度,精度为0.05% .可使用预制的软件“Getting started”进行简单设计 .可使用程序 SIWATOOL MS通过 RS 232接口很方便地对电子秤进行设置 .即使没有校准砝码,也能进行理论校准 .更换模块时无需重新校准电子秤 .可用于防爆区域 Ex区,配本安型称重传感器使用 Ex接口供电可用于防爆区域1 .可直接将一个远程指示器连接在TTY 接口上 SIWAREX MS拥有两个串行接口。 TTY 接口用来连接数字式远程指示器。重量值与状态信息可显示在远程指示器上。 通过 RS 232 接口连接一台 PC机,即可对 SIWAREX MS进行参数设定。此外,该接口也可用来与主机 (例如 PC)进行串行连接(SIWAREX协议)。 可借助 STEP 7-Micro/WIN将SIWAREX MS集成到设备软件中。与串行通讯连接的称重仪表相比, SIWAREX MS可省去连接到SIMATIC所需的成本高昂的通讯组件。 协同 SIWAREX MS与SIMATIC S7-200控制系统, SIWAREX MS电子模块是可任意编程的称重系统,可根据需要对该系统进行调整,使其适合生产要求。在 SIMATIC S7-200系统中可包含一台或多台秤。 联系人:丁女士 电话:13580989768 公司电话:0769-23186562 在线QQ:1473103363 邮箱:[email protected] 传真:0769-22881331 地址:广东省东莞市南城区鸿福路口腾龙商务中心609 以上图片信息仅供参考,更多详情欢迎来电咨询!! 西门子称重模块 7MH 系列 1、SIWAREX MS 模块 7MH4930-0AA01 2、SIWAREX CS 模块 7MH4910-0AA01 3、SIWAREX U 单通道模块 7MH4950-1AA01 4、SIWAREX U 双通道模块 7MH4950-2AA01 5、SIWAREX FTA 模块 7MH4900-2AA01 6、SIWAREX FTC 模块 7MH4900-3AA01 7、SIWAREX WP231 模块

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值