问题描述:

你有一架天平和N个砝码,N个砝码的重量分别是w1、w2、w3......wn。请你计算一共可以秤出多少种不同的重量?注意砝码可以放在天平的两边。

问题分析:首先砝码可以有三种状态,一个是放右边加重量,或者不放,再者就是放左边减重量,所以我们可以用枚举把每一个砝码的三种情况都枚举一遍,它的算法复杂度是3的N次方,当N越来越大时,3的N次方呈现指数爆炸式增长,极有可能会超时,但本题所给的样例不会超时,下面给出代码:

#include <iostream>
#include <iomanip>
typedef long long ll;                      /位数可能很长,所以用长整型
using namespace std;
const int maxn = 1e5 + 50;
int vis[maxn];
int a[maxn];
int N;
void dfs(int sum, int i)                      /三种状态函数
{
    if (i == N)
    {
        if (sum >= 0)
            vis[sum] = 1;
        return;
    }
    dfs(sum + a[i], i + 1);
    dfs(sum, i + 1);
    dfs(sum - a[i], i + 1);
}
int main()
{
    cin >> N;
    for (int i = 0; i < N; i++)
    {
        cin >> a[i];
    }
    dfs(0, 0);                        /从开头开始递推
    int ans = 0;
    for (int i = 1; i < maxn; i++)
    {
        if (vis[i] )
        {
            ans++;                   /记录可以秤出重量的总数
        }
    }
    cout << ans << endl;
    return 0;
}

我们还有另外一种更巧妙更省时的方法,那就是用动态规划!我们可以用2次0-1背包问题来很好地解决这个问题,第一次0-1背包问题先把放右边的情况先弄清楚,接着第二次0-1背包就可以把放左边的情况弄清楚,整合后就是该问题的最终答案。

#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
ll dp[1000005];                                        /本题的测试范围
ll w[105];
int main() {
    ll N;
    cin >> N;
    for (int i = 1; i <=N; i++)
    {
        cin >> w[i];
    }
    memset(dp, 0, sizeof(dp));            /数据清空
    dp[0] = 1;
    for (ll i = 1; i <=N; i++)
    {
        for (ll j = 100000; j >= w[i]; j--)
        {
            dp[j] = max(dp[j], dp[j - w[i]]);    /从大到小考虑每个称重,dp[j- w[i]]是没加之前的重量,如果可以加,就将d[i]赋值为1.
        }
    }
    for (ll i = 1; i <= N; i++)
    {
        ll s = 100000 - w[i];
        for (ll j = 1; j <= s; j++)
        {
            dp[j] = max(dp[j], dp[j +w[i]]);  /从小到考虑每个称重,dp[j+ w[i]]是没减之前的重量,如果可以减,就将d[i]赋值为1.
        }
    }  
    ll ans=0;
    for (int i = 1; i < 100000; i++)
    {
       
         ans = ans + dp[i];     /被赋值为1的即可以称出来的重量
    }
    cout << ans << endl;
        
    return 0;
}

砝码称重(枚举and动态规划)相关推荐

  1. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-936 砝码称重

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-936 砝码称重 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-936 砝码称重 前言 关于数学的疑问 算法训练 砝码称重 ...

  2. 【蓝桥杯-砝码称重】

    蓝桥杯-砝码称重 问题描述: 你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1, W2, · · · WN 请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边 输入的第一行包含 ...

  3. 51NOD 1449 砝码称重(贪心+进制思想)

    题目连接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1449 1449 砝码称重 题目来源: CodeForces 基 ...

  4. 第十二届蓝桥杯省赛 C/C++大学B组 试题G:砝码称重

    试题题目: 本题为编程题第二题 解题思路: 方法一:暴力求解 1.分析    首先利用数组W[N]W[N]W[N]记录NNN块砝码的质量.    模拟放取过程.先取第一块砝码放在天平上,再取第二块砝码 ...

  5. 洛谷 P2347 砝码称重

    P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...

  6. 【DP】砝码称重 (ssl 1072)

    砝码称重 ssl 1072 题目大意: 有6种砝码,每种的个数分别为a1,a2,a3,a4,a5,a6,请问可以平出多少种重量(0除外) Description 设有1g.2g.3g.5g.10g.2 ...

  7. 【OJ8756】砝码称重V2,可达性多重背包

    砝码称重V2 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=100,000),要求:计 ...

  8. 【codevs2144】砝码称重2,哈希什么的都去死吧

    砝码称重 2 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有n个砝码,现在要称一个质量为m的物体,请问最少需要挑出几个 ...

  9. Bailian4141 砝码称重【DP】

    4141:砝码称重 总时间限制: 1000ms 内存限制: 65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000),要求:计算用这些砝码能称出的不同 ...

  10. 【SSL】1072砝码称重

    [SSL]1072砝码称重 Time Limit:1000MS Memory Limit:65536K Description 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重< ...

最新文章

  1. 无服务器计算将会取代容器?
  2. linux 设置系统时间
  3. C++ 关键字——friend
  4. codesmith学习总结
  5. 湖北经济学院的计算机怎么样,湖北经济学院怎么样名气高吗?真实排名及实力如何?是一本吗...
  6. Magento教程 16:Magento价格规则的优先度
  7. 20145207《Java程序设计》实验二(Java面向对象程序设计)实验报告
  8. 微服务动态路由实现:OpenResty+K8s
  9. Spring Cloud Consul
  10. ALSA driver --PCM 实例创建过程
  11. 索引和数据完整性约束的总结
  12. numpy.ones用法
  13. 前端HTML中防止用户在短时间内频繁多次点击按钮
  14. python计算字节数_Python len()函数详解:获取字符串长度或字节数
  15. Machine Learning with Graphs:Part1
  16. 算法中的P问题、NP问题、NP难问题和NP完全问题
  17. 以ansi ,gbk,gb2312格式进行base64 加密和 base64解密(防止中文乱码)
  18. ISCC认证的申请条件是什么?
  19. eureka注册中心wro.css wro.js 404
  20. aiwi:如何称赞都不过分的革命性游戏

热门文章

  1. 大爱无疆,德泰先行——刘煊苗与他的德泰堂
  2. Java框架tk_TKmybatis的框架介绍和原理分析及Mybatis新特性
  3. 小程序轮播图实时更新
  4. 小程序实现3D轮播图效果
  5. java+mysql基于ssm企业进销存管理系统【计算机毕业设计】
  6. 串口编程 - 串口简介
  7. 港口应急广播系统方案
  8. 安装STK-CS61A 2011使用的Scheme解释器
  9. android webview卸载,安卓WebView清除localStorage
  10. 使用Python2.7和火狐浏览器下载QQ空间好友相册(二)