动态规划 1 讲评
作者:互联网
T1 顺手牵羊
题意:最少多少个正整数的平方和等于一个给定的数.
做法一
拉格朗日四平方定理: 任何一个正整数都可以表示成不超过四个整数的平方之和.
所以我们只需要做一个三维的枚举(四维压成三维),时间复杂度 O(n log n).
做法二
这题很容易看出是背包问题.
我们可以把每一块地看成一个价值为 1 ,重量为它的面积的物品.
然后背包容量是我们给出的数.
做一个完全背包即可.
T2 Building
这道题是二维费用背包模板题,可以直接套模板.
T3 [NOIP福建夏令营]生日礼物
题意:如何将 N 个数分成个数相同的两堆,使这两堆中每一堆数的和的差值最小.
二十分做法:暴力求解.
用一个 DFS 枚举所有数放在第一堆,并适当剪枝.
满分做法:判定性 DP.
我们定义: dp[i][j] : 标记前 i 个礼物能否凑出差距为 j 的礼物,能则 dp[i][j] = 1,否则 dp[i][j] = 0.
首先,0 个礼物凑出差距为 0 的礼物堆肯定是成立的,先标记为 1.
然后就开始 DP,第一层 i 枚举选的物品个数,第二层 j 枚举差距.
每一次枚举,判断 dp[i-1][j] 是否为 1,如果为 1,那么代表前 i-1 个物品可以凑出差距为 j.
那么,我们就把第 i 个物品也加进去,但是要讨论两种情况:
① j 加 a[i],减 b[i];
② j 加 b[i],减 a[i].
因为差距是对立的,你竟然选择了把 A 物品放到了这一堆,那么 B 物品一定要放在那一堆,差距为 abs(A - B).
所以,答案也从差距从小到大开始枚举,枚举出来 dp 值为 1 时直接输出即可.
T4 投资
多重背包模板题.
但是,只有多重背包肯定时不够的,时间复杂度会超。
标签:背包,凑出,讲评,枚举,差距,物品,动态,规划,dp 来源: https://www.cnblogs.com/zengpeichen/p/11118575.html