首页 > 其他分享 >砝码称重问题

砝码称重问题

时间:2024-03-18 10:34:16浏览次数:10  
标签:cnt const int res 问题 砝码 include 称重

\(Easy\)

题意:给定 \(n\) 个砝码,每个砝码的重量为 \(w[i]\),问随意选择 \(k\) 个砝码(\(1\)<=\(k\)<=\(n\)),能得到的不同重量的个数

// 可以转化为背包问题求恰好装满方案数
// 只不过,这个方案数我们只考虑0/1
// f[i]就表示装满体积i的方案数
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int M = 1010;

int w[] = {1, 2, 3, 5, 10, 20};
bool f[M];

int main()
{
    f[0] = 1;
    for(int i = 0; i < 6; i ++ )
    {
        int cnt;    cin >> cnt;
        while(cnt -- )
        {
            for(int j = M - 1; j >= w[i]; j -- )
                f[j] |= f[j - w[i]];
        }
    }
    
    
    int res = 0;
    for(int i = 0; i < M; i ++ )
        res += f[i];
    // 不包括重量为0的情况
    cout << "Total=" << res - 1 << endl;
    return 0;
}

\(Medium\)

给定 \(n\) 个砝码,问将 \(x\) 个放在砝码左侧,\(y\) 个放在砝码右侧,可以称出的重量有多少种(\(1\)<=\(x+y\)<=\(n\))

思路一

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110, M = 1e5 + 10;

int n, m, w[N];
bool f[2][M];   // 滚动数组优化
int res;

/*
f[i][j]:从前i个物品中选,称出重量为j的方案数(j=0/1)
我们规定:j = abs(left-right)
当前物品不选: f[i][j] |= f[i - 1][j]
当前物品选:
    f[i][j] |= f[i - 1][j - w]:放在左侧
    f[i][j] |= f[i - 1][j + w]:放在右侧
    当放在左侧且j-w<0时,例如j=1,w=2,再不妨设此时左侧为2,右侧为1,j=2-1=1
    [2] [1]
    -------
       |
    -------
    我们希望此时在左侧放一个重量w=2的砝码之后left-right=j=1,显然不可能啊!
    因为显然2+2-1=3,但其实,我们换一种角度想,如果left-right=1
    那么我们交换一下左右侧,变为:
    [1] [2]
    -------
       |
    -------
    此时left-right=-1不久存在了么
    因此说,当j-w<0时,由于数组下标不合法,我们可以将j-w改为abs(j-w),它们是等价的
*/

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++ )   cin >> w[i], m += w[i];
    
    f[0 & 1][0] = 1;
    for(int i = 1; i <= n; i ++ )
        for(int j = 0; j <= m; j ++ )
        {
            f[i & 1][j] |= f[(i - 1) & 1][j];
            f[i & 1][j] |= f[(i - 1) & 1][abs(j - w[i])];
            if(j + w[i] <= m)   f[i & 1][j] |= f[(i - 1) & 1][j + w[i]];
        }
    for(int i = 1; i <= m; i ++ )   res += f[n & 1][i];
    cout << res << endl;
    return 0;
}

思路二

更直观的思路,为了处理负数的问题,添加一个偏移量即可!

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110, M = 2e5 + 10, F = 1e5;

int n, m, w[N];
bool f[2][M];   // 滚动数组优化
int res;

/*
f[i][j]:从前i个物品中选,称出重量为j的方案数(j=0/1)
j=left-right
但是注意这样设置j的话,有 -m <= j <= m
因为体积为循环的时候是从 -m 到 m 而不是 0 到 m
*/

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++ )   cin >> w[i], m += w[i];
    
    f[0 & 1][0 + F] = 1;
    for(int i = 1; i <= n; i ++ )
        for(int j = -m; j <= m; j ++ ) // j=-m
        {
            f[i & 1][j + F] |= f[(i - 1) & 1][j + F];
            f[i & 1][j + F] |= f[(i - 1) & 1][j - w[i] + F];
            if(j + w[i] <= m)   f[i & 1][j + F] |= f[(i - 1) & 1][j + w[i] + F];
        }
    for(int i = 1; i <= m; i ++ )   res += f[n & 1][i + F];
    cout << res << endl;
    return 0;
}

\(Hard\)

标签:cnt,const,int,res,问题,砝码,include,称重
From: https://www.cnblogs.com/ALaterStart/p/18079813

相关文章

  • 【粉丝福利社】商业分析思维与实践:用数据分析解决商业问题(文末送书-进行中)
    ......
  • 倾斜摄影三维模型的立体裁剪的问题分析
    倾斜摄影三维模型的立体裁剪的问题分析   倾斜摄影是一种利用斜视角进行拍摄和测量的技术,可以获得具有高精度的三维模型。然而,在生成三维模型的过程中,立体裁剪是一个重要的问题。立体裁剪是指将倾斜摄影的影像数据与地面数据进行匹配和融合,以生成真实而准确的三维模型。本......
  • 处理K8S镜像无法拉取问题
    问题原因国内无法直接访问镜像地址,改为国内地址即可#!/bin/bash#downloadk8s1.28.8images#getimage-listby'kubeadmconfigimageslist--kubernetes-version=v1.15.2'#gcr.azk8s.cn/google-containers==k8s.gcr.ioimages=(kube-apiserver:v1.28.8kube-contr......
  • 明华读卡器读卡失败问题
    win11系统提示串口被占用问题描述:用第三方调试助手测试,每个波特率只能连接一次,再次连接提示串口被占用解决方案:安装CH340SER驱动,选择CH340的3.5.2019.1版本驱动把windows自动更新关闭取消USB根集线器关闭节约电源(通用串行总线控制器-驱动属性-电源管理-取消打钩)串口返......
  • 故障解析丨一次死锁问题的解决
    背景业务端遇到报错为"Deadlockfoundwhentryingtogetlock;tryrestartingtransaction"则表明有死锁发生名称配置数据库版本GreatSQL8.0.26隔离级别Read-Commitedinnodbstatus日志greatsql>showengineinnodbstatus\G************************......
  • Ubantu 20.4问题记录
    命令记录#列举磁盘列表df-h#查看所有文件,包括隐藏文件ls-a问题解决1.域名解析出现报错:域名解析暂时失败可能是因为配置DNS文件有问题,我们sudovim/etc/resolv.conf,配置namesever为我们指定的DNS地址。2.Ubantu重装后网络配置https://www.cnblogs.com/cyq63269454......
  • 工作中最常见的6种OOM问题
    前言最近我写的几篇线上问题相关的文章:《糟糕,CPU100%了》《如何防止被恶意刷接口》《我调用第三方接口遇到的13大坑》发表之后,在全网广受好评。今天接着线上问题这个话题,跟大家一起聊聊线上服务出现OOM问题的6种场景,希望对你会有所帮助。1堆内存OOM堆内存OOM是最常见的OOM了......
  • 汽车制造业供应商管理会面临哪些问题?要如何解决?
    汽车行业的供应链是及其复杂的,并且呈全球化分布,企业在知识产权方面的优势很可能是阶段性的。企业需要持续保持领先,将面临巨大的挑战,尽快地将产品推向市场是保持领先的唯一途径。然而,如果没有正确的方式去实现安全性、流程化和标准化,企业的优势则有可能不复存在,比如汽车制造业供应......
  • 在IDEA中使用Gradle存在的显示乱码问题
    项目使用Gradle进行依赖管理,当代码中存在错误时,运行程序时Build界面将报错(这是正常的),但是在报错结果中显示乱码信息,如下所示:解决办法:给IDEA添加JVM参数:-Dfile.encoding=UTF-8,然后重启IDEA即可。参数修改路径:Help->EditCustomVMOptions...【参考】如何修复IDEA使用Gr......
  • chapter12-2-背包问题
    动态规划最经典并且在机试中重点考查的问题——背包问题。背包问题的变体繁多,这里主要讨论3种。1.0-1背包0-1背包问题描述的是,有\(n\)件物品,每件物品的重量为\(w[i]\),其价值为\(v[i]\),现在有容量为\(m\)的背包,如何选择物品使得装入背包物品的价值最大。首先介绍求解这个问题的......