洛谷P1441砝码称重(二进制讲法)

STM32CubeIDE开发环境搭建与GPIO控制实战 嵌入式开发中,MCU开发环境构建是软硬件协同的起点,其核心在于工具链选型、外设抽象层级与调试可靠性。HAL库作为ST官方标准硬件抽象层,通过统一接口屏蔽芯片差异,显著提升工程可移植性;而STM32CubeIDE则以图形化配置+自动生成代码的方式,实现‘配置即代码’的确定性开发范式。该组合在教学验证、原型迭代和中小规模量产中具备高性价比技术价值,广泛应用于智能传感、工业HMI及IoT终端等场景。本文聚焦STM32CubeIDE 1.15.0环境部署、MyST账户与固件包管理、ST-LINK驱动校验,以及基于H 阅读详情

没错,经过两年半的个人练习,我终于决定入坑二进制

P1441题目传送门 

首先先水一发本题的正解。主要思路是先用dfs求出n个砝码去掉m个后的所有组合,然将这些组合都按照dp的背包肝一遍,求出最大解即可。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=205;
int n,m;
int a[maxn];
int path[maxn];                    
int ans;
int f[100005];
void dp(){                        
	memset(f,0,sizeof(f));
	int sum=0;
	int ans0=0;
	for(int i=1;i<=n-m;i++) sum+=path[i];
	f[0]=1;
	for(int i=1;i<=n-m;i++)
	  for(int j=sum;j>=path[i];j--)
	    f[j]+=f[j-path[i]];
	for(int i=1;i<=sum;i++) if(f[i]) ans0++;
	ans=max(ans,ans0);
}
void dfs(int cur,int lst){
	if(cur>n-m){
		dp();
		return;
	}
	if(n-lst<n-m-cur) return;
	for(int i=lst+1;i<=n;i++){
		path[cur]=a[i];
		dfs(cur+1,i);
		path[cur]=0;
	}
}
int main(){
	
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	dfs(1,0);
	printf("%d",ans);
	
	return 0;
	
}

但是

我今天要讲的可是二进制啊啊啊啊啊啊啊啊啊啊


在发文章之前,我可是花了大功夫补了一下bitset的知识

这里介绍一下:


一、概念
bitset可以说是一个多位二进制数,每八位占用一个字节,因为支持基本的位运算,所以可用于状态压缩,n位bitset执行一次位运算的时间复杂度可视为n/32.


二、基本操作

1.定义:
bitset< n > s;
表示一个n位的二进制数,<>中填写位数;

2.位运算操作符:
~s: 返回对s每一位取反后的结果;
&,|,^:返回对两个位数相同的bitset执行按位与、或、异或运算的结果;
<<, >>:返回把一个bitset左移,右移若干位的结果.(补零);

==,!=:比较两个位数相同的bitset代表的二进制数是否相等;

3.[ ]操作符:
s[k] :表示s的第k位,即可取值也可赋值,编号从0开始;

4.count:
s.count() 返回二进制串中有多少个1;

5.any/none
若s所有位都为0,则s.any()返回false,s.none()返回true;
若s至少有一位为1,则s.any()返回true,s.none()返回false;

6.set/rest/flip
s.set()把s所有位变为1;
s.set(k,v)把s的第k位改为v,即s[k]=v;
s.reset()把s的所有位变为0.
s.reset(k)把s的第k位改为0,即s[k]=0;
s.flip()把s所有位取反.即s=~s;
s.flip(k)把s的第k位取反,即s[k]^=1


这样我们就可以写出P1441的二进制写法了。

代码:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int w[30];
int ans = -inf;
int count_one(int x)//x的二进制中第0到n-1位中1的个数
{
    int cnt = 0;
    for(int i = 0; i <= n - 1; ++i)
        if(x & (1 << i))//注意做完按位与后的结果不是1,如可能为000010000,所以不要写成x & (1 << i) == 1
            cnt++;
    return cnt;
}
int main()
{
    cin >> n >> m;
    //我们在用二进制写题时,下标最好以0开始
    for(int i = 0; i <= n - 1; ++i)
        cin >> w[i];
    //(1 << n) - 1的二进制有n个1	
    for(int i = 0; i <= (1 << n) - 1; ++i)
    {
    	//如果此时的i的二进制中有n-m个1
        if(count_one(i) == n - m)
        {
            bitset<2010> b;
            b[0] = 1;//含义为重量0可以被称出
            for(int j = 0; j <= n - 1; ++j)
                if(i & (1 << j))//如果i的第j位上是1
                    b = b | b << w[j];
            ans = max(ans,(int)b.count());
        }
    }
    cout << ans - 1 << endl;//把重量为0的情况排除
    return 0;
}

 通过截图:

串口、COM、UART、TTL、USB、RS-232、RS-485、I2C、SPI、CAN、1-WIRE 一文搞定,赶紧收藏吧 阅读详情

相关推荐

Innovus 安装全过程

【代码】Innovus 安装全过程。

lmyynlbcy的博客 5536

洛谷P1441 砝码称重 DFS+DP

题目描述 现有n个砝码,重量分别为 ai,在去掉 m个砝码后,问最多能称量出多少不同的重量(不包括 0)。 请注意,砝码只能放在其中一边。 输入第 1 行为有两个整数 n 和 m,用空格分隔。 第 2 行有 n个正整数 a1, a2, a3,… , an表示每个砝码的重量。 输出仅包括 1 个整数,为最多能称量出的重量数量。 样例输入 1 2 2 样例输出 3 【样例说明】 在去掉一个重量为 2 的砝码后,能称量出 1, 2, 3 共 3 种重量。 【数据规模】 对于 100%100% 的数据, n≤20,

weixin_43502713的博客 1616

MATLAB实战:四桥臂逆变器3D-SVPWM调制算法仿真全流程(附代码)

本文提供了一份完整的MATLAB/Simulink实战指南,详细解析了四桥臂逆变器的3D-SVPWM调制算法仿真全流程。文章从工程实践出发,手把手指导如何搭建模型,涵盖从abc静止坐标系变换、三维空间矢量区域判定、作用时间计算到PWM信号生成与调试等核心环节,并附有代码示例和常见问题解决方案,旨在帮助工程师快速掌握这一应对不平衡负载的高效调制技术。

qsc90123456的博客 234

巴协(Bachet)砝码问题:利用三进制或二进制

砝码问题 砝码问题是巴协(Bachet)给出的:要想在天平上称出1到40磅在内的任何整磅数,问最少需要几个多重的砝码?这里有两种放置砝码的办法: (1)所有砝码只放进天平的一端 (2)砝码可以放进天平的两端 (以下的所有数均是大于0的整数) 对于(1):所有砝码只放进天平的一端 也就是说,所有的砝码只能通过相加来得到对应的整磅数。因此将问题化为:用最少的几个数仅通过相加,可以得到1~40内的任意整数。 为很好的解决问题,我们再将问题最简化:只用一个数,让它表示1~n以内的任意整数,并且要使n尽

m0_62190011的博客 2534

【仿真】Carla Python API实战:从零搭建自动驾驶测试环境

本文详细介绍了如何使用Carla Python API从零搭建自动驾驶测试环境。通过Carla仿真平台,开发者可以构建高度逼真的城市环境和车辆物理模型,利用Python API实现传感器配置、数据采集、场景构建及自动驾驶算法集成。文章还分享了实际项目中的调试技巧和性能优化经验,帮助读者快速掌握自动驾驶仿真测试的核心技术。

weixin_29050513的博客 213

深入浅出:UE4类型系统完整构建过程详解

UE4的类型系统是一个复杂但设计精巧的架构,它通过静态代码生成和运行时构建的完美配合,实现了强大的反射功能。理解这个过程不仅有助于解决开发中的问题,也能让你更好地利用UE4的各种高级特性。就像建造一栋大楼需要经过设计、备料、框架、装修、验收等多个阶段,UE4类型系统的构建也是一个多阶段、精细化的过程。每个阶段都有其特定的职责,共同协作完成从源代码到运行时对象的转换。

m0_45371381的博客 911

砝码称重 洛谷 1441

题目: 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。 输入输出格式 输入格式: 输入文件weight.in的第1行为有两个整数n和m,用空格分隔 第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。 输出格式: 输出文件weight.out仅包括1个整数,为最多能称...

weixin_34355559的博客 388

autodl云服务器使用中的conda源报错

通过find path -name filename找到.condarc文件,在autodl服务器中,一般在/root/.condarc。为了利用jypyter打开conda虚拟环境运行,需要下载ipykenel。这个报错是源的问题,在通过源获取包元数据时出现了HTTP 429错误。通过conda换源解决。修改.condarc文件,命令: vim .condarc。但这样还不能解决问题,得把报错中有问题的源注释掉。通过以下命令添加清华镜像源。把报错的链接源注释如下。

Ty_kilig的博客 1584

BZOJ 1192 [HNOI2006]鬼谷子的钱袋:二进制 砝码称重问题

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1192 题意:   鬼谷子带了a元钱,他要把a元钱分装在小袋子中,使得任意不大于a的数目的钱,都能用几个小袋子凑出来。   问你最少用几个小袋子。 题解:   砝码称重问题(二进制):     你可以自由设置砝码的数量和重量,使得a以内的任意重量都能被称出(只考虑...

a1392136的博客 321

Halcon阈值算子 -- 局部阈值之dyn_threshold

Halcon阈值算子 – dyn_threshold HALCON有很多阈值算子,接下来将一一介绍。本文先介绍dyn_threshold。 以下介绍主要参考HALCON帮助文档,并加上自己的体会。如有纰漏,欢迎留言指出 理论介绍 dyn_threshold算子的函数签名如下: dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : ) 输入参数有: OrigImage:待处理图像 ThresholdIm

m0_47015717的博客 5385

【AI编程干货】Vibe Coding 技巧(适用于AI编程IDE)

用 AI 写代码这件事门槛低,谁都能对着对话框输入几句话让它生成代码,但生成的东西能不能用、出了问题能不能兜住,这中间的差距比想象中大得多。 我从去年开始把 AI 编码工具作为主力开发手段,中间经历过项目失控、代码雪崩、反复返工,慢慢摸索出一套相对稳定的工作方式。这篇把核心的五个习惯拆开聊聊,都是实际项目里验证过的。

blues_C的博客 621

洛谷P1441 砝码称重【状态压缩】

时空限制 1000ms / 128MB 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。 输入格式: 输入文件weight.in的第1行为有两个整数n和m,用空格分隔 第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。 输出格式: 输出文件weight.out仅包括1个整数,为最多能称量出的重量数量。 说...

niiick 397

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

洛谷P1441 砝码称重

题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。 输入输出格式 输入格式: 输入文件weight.in的第1行为有两个整数n和m,用空格分隔 第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。 输出格式: 输出文件weight.out仅包括1个整数,为最多能称量出...

weixin_30826761的博客 161

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

P1441 砝码称重(洛谷)

原题链接:https://www.luogu.com.cn/problem/P1441 题目大意:现有n个砝码,重量分别为 ai​,在去掉 m 个砝码后,问最多能称量出多少不同的重量(不包括 0)。 观察数据范围并不是很大,先考虑比较朴素暴力的算法。 思路:利用二进制数作为状态数进行枚:一个n位二进制数第i位是否为1代表选不选用第i个砝码。这个二进制数需要满足条件:有且仅有n-m位是1,表示从n中抛弃了m个砝码。 这里我们引入bitset,你可以把它看成是一个数组,但是这个数组的每一位都只有一个比特

weixin_51718393的博客 895

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

洛谷 P1441 砝码称重 子集枚举+bitset

https://www.luogu.org/problem/P1441 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。 请注意,砝码只能放在其中一边。 输入格式 输入文件weight.in的第1行为有两个整数n和m,用空格分隔 第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。 输出格式 输出文件wei...

xiji333的博客 812

【洛谷题解】P1441 砝码称重

洛谷P1141砝码称重题解。

lovely_cyqの小窝 484

【洛谷 P1441】 【状压】 砝码称重

【洛谷 P1441】 【状压】 砝码称重 题目 解题思路 用二进制表示选了哪些砝码 用bitset统计有多少种质量可称量 代码 #include<iostream> #include<cstdio> #include<bitset> using namespace std; bitset<2001> s; //类似数组,但只能存0或1 int n,m,z,a[30],ans,w[3000100]; int main() { scanf("%d%d

Y的博客 273

(DP003)背包与dfs综合 以洛谷P1441、P1474、P2347为例

一、流程 P1474和P2347可以看做是P1441的子问题,所以先分析P1441,拆解出子问题之后再看P1474和P2347,然后回头解决P1441. 二、P1441砝码称重 基本思路就是先dfs求出组合,联系前面做过的洛谷P1103书本整理,可以把去掉m个砝码转化为选择n-m个砝码,这样比较好想。求出组合之后,再用背包计算方案数。先是写出求组合的代码,这个比较基础: void dfs(int ...

numb_ac的博客 360

【位运算 gosper‘s hack】洛谷P1441 砝码称重

题目给的n的范围是20,因此我们可以用位运算来进行模拟,例如0...0(18个0)11表示只取了第0、1个砝码进行称重。是从n个砝码中去掉m个砝码,等价于从n个砝码中取n-m个砝码,并且砝码只能放在同一边,求从n个砝码中取出n-m个砝码最多能称出多少种重量。

qq_52114254的博客 368

洛谷题单【动态规划5】状态压缩动态规划

洛谷题单【动态规划5】状态压缩动态规划

Tracy_yi的博客 455

杨校老师课堂之备战信息学奥赛算法背包DP练习题汇总

背包DP(动态规划)是解决一类在容量限制下选择物品以获得最大价值或满足特定条件的优化问题。:有 N 个物品,第 i个物品体积为 vi,价值为 wi,背包总容量为 V。需选择物品装入背包,使得总体积不超过 V 且总价值最大。关键思想:通过状态转移方程表示不同容量下的最优解,逐步递推求解全局最优。

杨校的博客 1295

P1441 砝码称重 + 状压dp思路

二进制,只有0与1,但是不光可以从数字上看,它也可以表示“有”与“没有”。比如本题,一个长度为4的序列,我们可以用1001来表示第一个没有了,第二,三个还留着,第四个也没有了。那么,本来一个很长的序列就可以转换成一个数字了——1001=9。状压dp通常适合长度较小,但是需要枚举所有状态的问题。

记录一些学习OI中题目的笔记 267

[数学模型]称重问题

两类称重问题:一、给定砝码,可以称多少种不同的质量。二、怎么安排使得可以称重的次数最少。   一、砝码个数 用天平称量物体质量,方法是1.一个秤盘放物体,另一个秤盘放砝码。这对应着二进制思想。2.一个秤盘放物体,两个秤盘都可以放砝码,二者的差对应着物品质量。这对应着三进制的思想。   1.      二进制思想 将称量物品的最大质量写成二进制的形式,那么需要砝码的个数就是二进制的位数。

Zhaohui1995_Yang的专栏 3369

P1441 砝码称重 (dfs+dp或者bitset)

P1441 砝码称重 原题链接 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。 请注意,砝码只能放在其中一边。 输入格式 输入文件weight.in的第1行为有两个整数n和m,用空格分隔 第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。 输出格式 输出文件weight.out仅包括1个整数,为最多能称...

翔哥哥的博客 569

P1441 砝码称重 - 搜索+dp

你会发现 对于这种很像背包的DP。。。不打滚动数组很有可能错,因为很多时候可能会忘记保留以前状态的答案,体现在f[i][j] = max(f[i-1][j], f[i][j]);上,因为f[i][j]可能被f[i][b[i]]更新,所以要取max,若想不取max,则必须保证这个状态只会被更新一次 这题刷表比填表更好写,刷表你的初始化只需要让f[0] = 1 然后用目前的0去更新其他状态 总结...

Zolrk的博客 268

题解 P1441 【砝码称重】

题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。 【数据规模】 对于20%的数据,m=0; 对于50%的数据,m≤1; 对于50%的数据,n≤10; 对于100%的数据,n≤20,m≤4,m<n,ai≤100。 主要思路 : 爆搜 + XJB剪枝 + XJB判重 对,就是爆搜。我们暴力搜索一下我们要哪几个砝码要选。这里就涉...

weixin_30294021的博客 406
上一篇: c++二分查找(往下看,有彩蛋)
下一篇: 改名通知+c++并查集教程
火龙果king
博客等级 码龄5年 89粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值