SSL 1276 石子合并 (动态规划 01背包)

[动态规划&深度优先搜索]石子归并 题目描述 阅读详情

动 规 永 远 的 基 础 — — 01 背 包 问 题 动规永远的基础——01背包问题 动规永远的基础——01背包问题


题目大意:

你有N个石头,质量分别为W1,W2,W3…WN. (W<=100000) 现在需要你将石头分为两堆,使两堆质量的差为最小。


解题思路:

第一眼看到这道题,你会想起爆搜,它也确实能过,但是我们不那么做,为什么?
因为

搜索是粗暴的咆哮,而DP是自由与骄傲的吟唱

但是,这题怎么用DP做呢?状态是什么?阶段是什么?我们依然一无所知。
其实我们可以这么想,让两堆石头质量差最小,其实就是一个选与不选的过程,这是什么DP?是那个永远的神,拥有变化万千的算法——01背包DP啊!

那01背包到底是什么呢?我们来详细的聊聊……
再看看基础的01背包例题吧~~~

知道了可以用01背包来做,算法中的 物品价值 是什么也知道了,物品质量 是什么也知道了,但背包的容量到底多大啊?题目中的“使两堆质量差值最小”似乎没有明确给出啊!!

观察题目,我们知道了我们要求的是两堆石头的最小差值,那么最小差值的本质是什么?就是其中一堆石头减去另一堆石头的值,也就是说这题实际上就是让我们求其中的一堆石头该怎么安排——思路似乎变明朗了!

如何安排石头让差值最小呢?就是让其中的一堆石头的质量尽量接近所有石头的总质量之和的 1 2 \frac1 2 21​!
有了这个思路,问题得以转换,让选取的变量尽量接近而不超过一个固定的常量,这不就是01背包算法吗?

设 V V V为所有石头的总质量之和。
石头有选与不选两种转态,有一个容量为 1 2 \frac1 2 21​V的背包,如何在不超过容量的情况下装最重的石头
题解看到这里,你就会发现,这就是一道最普通的01背包题。

状态转移方程: d p v = m a x ( d p v , d p v − w i + a i ) dp_v=max(dp_v,dp_{v-w_i}+a_i) dpv​=max(dpv​,dpv−wi​​+ai​)

也不多说了,重点是将问题层层转换为最原始的状态,只要明白了,任何算法都可以很简单

CODE

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int t=0,m,a[110],w[110],ans;
int dp[1000001];
void input()
{
	cin>>m;
	for(int i=1;i<=m;i++)
	  {
	  	cin>>w[i];  //单个石头质量 
	  	t+=w[i];  //用T表示石头总质量 
	  }
}

void DP()  //标准01背包 DP 代码 
{
	for(int i=1;i<=m;i++)
	  {
	  	for(int j=t/2;j>=w[i];j--)
	  	  {
	  	     dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
	  	     ans=max(ans,dp[j]);
		  }
	  }
	cout<<(t-ans)-ans;  //输出两堆石头的差值 
}

int main()
{
	input();
	DP();
	return 0;
}

总结:

01背包 问题的最大特点就是多变。因此,01背包问题最大的难点,就是你能否将一个 畸形的01背包问题 转换为你所学过的,你所认识的那个样子,将一个最不像01背包的题目,用01背包的做法AC。

只要学会了题目之间的变通,01背包真的很简单。

从BSCAN到BAP:深度解析Tessent MBIST逻辑的协同工作机制与设计考量 本文深入解析了Tessent MBIST逻辑中BSCAN Interface、Logic Group Def、Controller与BAP模块的协同工作机制。文章以一条测试指令的完整路径为例,详细阐述了数据流与控制流如何跨模块、跨时钟域协同工作,并重点探讨了MBIST BAP在协议转换与流量管理中的核心桥梁作用,为芯片内建自测试的集成与调试提供了关键的设计考量和实战技巧。 阅读详情

相关推荐

随机化策略——随机变量rand、约束constraint、权重dist、随机数产生示例

文章目录一、随机变量类型1.1.rand随机变量1.2.randc随机变量二、随机化约束2.1.constraint指定约束范围2.1.1.关系操作符约束(>、<、=、>=、<=)2.1.2.范围操作符约束(inside)2.1.3.权重分布约束(dist)2.1.4.条件约束(if-else; ->)三、启动随机化——randomize( )函数四、关闭或打开随机变...

Mr.翟的博客 2万+

zufeoj_平分石头

题目链接:http://acm.ocrosoft.com/problem.php?cid=1222&amp;pid=28题目描述有一n个石头,它们的重量分别是 W1, …, Wn. 写一个程序,把它们分成两堆,使得两堆石头的重量差最小。输入输入 n (1 ≤ n ≤ 20)表示石头的个数。 第二行n个石头的重量 W1, …, Wn ( 1 ≤ Wi ≤ 100000) 输出输入最小的差(绝对值)样...

Mongo_girl 2135

educoder数字逻辑实训:寄存器设计与应用(Logisim)

第1关:基本寄存器的设计 任务描述 本关任务:在Logisim中,构建由4个D触发器构成的4位基本寄存器,要求上升沿触发,具有异步复位功能。 第2关:移位寄存器的设计 任务描述 本关任务:在Logisim中,构建由4个D触发器构成的4位右移移位寄存器,要求上升沿触发,具有异步复位功能。 第3关:循环移位寄存器的设计 任务描述 本关任务:在Logisim中,构建由4个D触发器构成的4位循环右移移位寄存器,要求上升沿触发,具有异步复位功能以及并行数据同步加载功能。 第4关:并行..

qq_52209002的博客 1万+

有一堆石头质量分别为W1,W2,W3...WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。...

1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <cstring> 5 #include <cstdio> 6 7 using namespace std; 8 9 int main(){ 1...

weixin_30587025的博客 801

SMPTE ST 2110 概论(三)

SMPTE ST 2110 概论(三)ST 2110-30:未压缩的PCM音频流ST 2110-31:非PCM音频传输ST 2110-40:辅助数据传输结语 ST 2110-30:未压缩的PCM音频流 鉴于音频系统是广播系统中最复杂,也是最重要的一套系统,我们先来回顾一下广电音频系统的历史。 最老式的音频都是基于模拟信号的,具有有限的动态范围,并且用连续的电压变化来描述音频。再后来就基于数字信号(...

Cidd0422的博客 1万+

《UDS协议从入门到精通》系列——图解0x2E:通过ID写数据

图解数据包格式+直观的通信示例,迅速认识0x2E服务!!

车载系统攻城狮 3602

石子归并

Description   你有一堆石头质量分别为W1,W2,W3...WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。 Input   第一行为整数N(1 Output   输出合并后两堆的质量差的最小值 Sample

1629

170、电机控制中的温升测试

本文以一次IGBT炸管事故为切入点,深入剖析电机控制中温升测试的实质:不仅是温度测量,更是对铜损、铁损、散热效率等热管理问题的系统验证。作者强调测试前热电偶布置、环境记录、预运行的重要性,提出实时监控电流谐波、绕组电阻、散热梯度等关键参数,并通过损耗分离与冷却系统实测,揭示真实热源。结合温升曲线异常分析与经验建议,强调留余量、仿真结合实测、关注瞬态工况等实践要点,警示温升测试是保障可靠性与安全性的核心环节。

2401_88858637的博客 49

动态规划三道例题对比学习(0-1背包/最长公共子序列/石子合并)附流程图+备忘录图

用三道题从原理上理解动态规划!

qq_51490212的博客 895

ZYNQ GP总线实现PS与PL交互

3,完成 ZYNQ7 Processing System 的配置更改后,回到 Diagram 界面中,可以看到新出现了名为 M_AXI_GP0_ACLK、M_AXI_GP0 和 FCLK_CLK0 的接口,下面我们要对这些接口进行连接或引出。此处的偏移量,AXI的相邻寄存器偏移量相差4个字节,默认slv_reg0的偏移量是0,可以推导出slv_reg1,slv_reg2的偏移量分别为4和8,这里只用到了slv_reg0,所以偏移量为0。当然了,窗口数量的增加,势必会使得单个窗口的采样深度变小。

wangjie36的博客 7094

团体程序设计天梯赛竞赛题--登顶题【L3-039 攀岩】

登顶级 3 道题,每道题 30 分,满分为 90 分。

Pretty Boy Fox的博客 654

【SSL】1276石子归并(01背包)(DP)

【SSL】1276石子归并(01背包) Time Limit:10000MS Memory Limit:65536K Description 你有一堆石头质量分别为W1,W2,W3…WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。 Input 测试数据第一行为整数N(1<=N<=20),表示有N堆石子。第二行为N个数,为每堆石子的质量。 Output 每组测试数据只需输出合并后两堆的质量差的最小值。 Sample Input 5 5 8 13 27 14 Sampl

weixin_46975572的博客 316

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【SSL_1276】石子归并 (DP)

石子归并 题目 你有一堆石头质量分别为W1,W2,W3…WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。 Input 测试数据第一行为整数N(1<=N<=20),表示有N堆石子。第二行为N个数,为每堆石子的质量。 Output 每组测试数据只需输出合并后两堆的质量差的最小值。 Sample Input 5 5 8 13 27 14 Sample Output 3 解题思路 还是01背包 ,把一堆石头分成尽量平均的两堆石头,使得两堆石头质量的差为最小, 也就是说容量为

keyixi的博客 1129

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

用01背包解决石子归并问题

http://blog.youkuaiyun.com/w397090770/article/details/8028945 题目:有一堆石头质量分别为W1,W2,W3...WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。      这道题目可以用01背包问题来解决。即求出和最接近sum/2的一个子集 令f(i, j)表示前i个元素中和最接近j的子集的和(有点绕),则有:

miao6664659的专栏 735

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

平分石头

平分石头 题目描述: 有一n个石头,它们的重量分别是W1, …, Wn. 写一个程序,把它们分成两堆,使得两堆石头的重量差最小。 输入格式: 输入 n (1 ≤ n ≤ 20)表示石头的个数。 第二行n个石头的重量 W1, …, Wn ( 1 ≤ Wi ≤ 100000) 输出格式: 输入最小的差(绝对值) 样例输入: 5 5 8 13 27 ...

anyin3468的博客 1191

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 252

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 322

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 301

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 596

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 136

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 23

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 751

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 358

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 172

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 415
上一篇: [NOIP1996 提高组] 挖地雷 (动态规划)
下一篇: Cow Cash G (动态规划 完全背包)
.SAI.
博客等级 码龄5年 835粉丝 63原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值