【dp-类背包】Kas 7.4测试 COCI

博客讲述了如何通过动态规划(DP)解决Kas 7.4测试中的问题,该问题涉及将钞票分成两堆,使得两堆差值最小且总金额最大。首先尝试暴力搜索,但发现需要更复杂的方法。DP状态定义为dp[i][j]表示前i张钞票可以分成差值为j的两堆时,这两堆中较大堆的和。通过转移状态来优化,排除无效状态,最终找到最优解。
摘要由CSDN通过智能技术生成

样例:

4
2
3
1
6


5
3
2
5
8
13

首先看到这道题,好简单的样子
然而。。。
第一步,想不出来正解先暴力 然后我暴力打爆了 然后。。。就真的爆了

我想的是暴搜两人相等的钱数是多少
其实我想错了 暴搜的话也不能只搜两人相等的钱数 因为剩下那一堆不一定凑得出来这个数
每一张钱有三种情况:给甲,给乙,两人都不拿


好 暴搜就说到这里
然后 d p dp dp 其实 d p dp dp我觉得是与暴搜有关联的 联系一下 我们先考虑定义这样的状态:
d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]:前i张钱 一堆为j 一堆为k这个方案是否可行(01状态) 答案就是 d p [ n ] [ x ] [ x ] dp[n][x][x] dp[n][x][x]为1的最大的x

显然这种状态是对的
但是 这个状态是不优的
在遇到一些两堆差值相等的时候 比如:
1 4
3 6
如果我们找到一组数使得1 4相等 比如说:5 2
那么5 2也一定能使3 6变得相等
而我们要求最大 那么1 4这个状态是没有贡献的 所以我们要去掉这些多余的状态 只保留最大的

所以我们定义 d p [ i ] [ j ] dp[i][j] dp[i][j]为:i张钞票分成两堆 这两堆的差值为j时 这两堆的和的最大值

转移的时候 从 i − 1 i-1 i1的状态转移过来 对于第 i i

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值