首页 > 其他分享 >01.26 背包的拉链坏了

01.26 背包的拉链坏了

时间:2024-01-27 20:45:58浏览次数:26  
标签:le log 拉链 复杂度 01.26 背包 物品 DP

讲真,我觉得我本来想把今天要写在这里的题投联考的。

但是下次联考的我想投的题已经有了,所以就这题就不投联考了!

但是我怎么感觉这题加强比我想投的题更好一些呢。可能是因为强数据更难造吧所以懒了!

1 ARC096F Sweet Alchemy (\(O(n^4)\))

\(n\le 50\) 个物品,物品重量 \(w_i\le 10^9\),物品价值 \(v_i\le n\),每个物品只能选不超过 \(D\le 10^9\) 个,总重量限制 \(\le 10^9\),最大化价值和。

首先,物品重量很大,但是价值很小。很自然地切换价值和重量。我们枚举总价值之和(\(O(n^2)\)),然后求出达到这个总价值的最小总重量。

(但是希望大家不要像我一开始做这题的时候直接上来一个二分凭空多了个 \(\log\)!)

然后注意到物品数量很少,我们很自然地想到可以做部分贪心,然后小范围 DP。

下面给出证明(前提为 \(D\ge n\))(以前从来没仔细证过,但是这种贪心不去仔细证容易出问题)

令 \(c_i=\frac{w_i}{v_i}\)(\(c_i\) 越小,我们称其性价比越好)。考虑取 \(i,j\) 满足 \(c_i<c_j\),则有 \(w_iv_j< w_jv_i\)。于是,假如我们背包中选取的 \(j\) 的数量满足 \(j\ge n\) 且选取 \(i\) 的数量满足 \(i\le D-n\),那么我们一定可以将 \(v_i\) 个 \(j\) 替换为 \(v_j\) 个 \(i\),使得总价值不变,总重量变小。
不断这样调整,最终一定满足按 \(c_i\) 排序后一个前缀选取的个数全部 \(\ge D-n\),且后缀选取的个数全部 \(\le n\)。

于是我们可以得到一个基于这个证明的做法:枚举这个前缀,这个前缀全体选 \(D-n\) 个,然后再对总体做一次每个数只能选 \(\le n\) 个的多重背包。

于是总复杂度 \(O(n^4)\)。

2 (隐藏霓虹来源)背包计数

\(n\le 50\),\(a_i\le 500\),\(m\le 10^{18}\),问 \(\sum x_ia_i=m\) 的非负整数解组数。

考虑如下的一种有趣的办法:我们首先将 \(m\) 进行拆分,拆分成二进制位。

对于每个 \(x_i\),我们依次按数位 DP 的方式决定其每一位是 \(0\) 还是 \(1\)。

考虑如下的 DP 状态:\(f(i,j,0/1)\) 表示考虑了所有 \(x_i\) 的 \([0,i]\) 位,向 \(i+1\) 位的进位有 \(j\),得到的总和的第 \(i\) 位是 \(0/1\)。

我们首先可以从 \(f(i-1,j,[2^{i-1}]m)\) 转移给 \(f(i,\lfloor{\frac{j}{2}}\rfloor,j\text{ mod }2)\)。然后我们依次考虑每一个 \(x\),进行转移。这里转移式子不是很方便用 latex 打,但是是容易的。

考虑该算法的时间复杂度:第一维 \(\le \log m\),第二维 \(\le 2\sum a_i\),转移复杂度 \(O(n)\),于是总时间复杂度 \(O(n^2a\log m)\),十分高速。

我们也可以从高位往低位 DP,不过会更加复杂一些:由于 \([0,i-1]\) 往 \(i\) 的进位是 \(\le 2na\) 的,所以我们可以令 \(f(i,j)\) 表示考虑 \([i,\log m]\) 位,得到的和为 \(j\times 2^i\),但是有效的 \(j\) 只处于 \([\frac{m}{2^i}-2na,\frac{m}{2^i}]\)
的。复杂度还是一样的。

3 ARC096F Sweet Alchemy (\(O(n^3\log D)\))

考虑,每个物品可选 \(\le D\) 个,然后直接做背包。

具体而言,我们把 \(D\) 可以进行拆分,用多重背包二进制拆分的办法拆成 \(\le 2\log D\) 个元素。

然后我们按照上述方法(高位往低位)进行数位 DP,状态类似。

所以前面提到的方法也可以做最优化的多重背包。多重背包计数是做不了的,因为会算重。

复杂度是 \(O(n^3\log D)\)。提出这个做法(题解区)的作者表示可以与算法一的一些思想结合达到 \(O(n^3\log n)\),但是和他探讨了一下后我感觉不是很对。这里就不再多说了,如果后续能够继续优化的话就再说了吧。

其实写这篇的时候,我是兴致勃勃地觉得可以优化到 \(O(n^3\log n)\) 的,但是写着写着感觉就不大对劲了。唉,没办法啊!

标签:le,log,拉链,复杂度,01.26,背包,物品,DP
From: https://www.cnblogs.com/TetrisCandy/p/17991894

相关文章

  • 背包dp
    1.01背包include...usingnamespacestd;constintN=1001;//二维intn,m;intv[N],w[N];intf[N][N];intmain(){cin>>n>>m;for(inti=1;i<=n;i++)cin>>v[i]>>w[i];for(inti=1;i<=n;i++)for(intj=0;j<=m;j++){f[i][j]=f[i-1][......
  • 2024-01-27:用go语言,阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有N堆金币, 第i堆金币
    2024-01-27:用go语言,阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有N堆金币,第i堆金币的总重量和总价值分别是m[i]、v[i],阿里巴巴有一个承重量为T的背包,但并不一定有办法将全部的金币都装进去,他想装走尽可能多价值的金币,所有金币都可以随意分割,分割完的金币重量价值比(也就是单位......
  • 动态规划dp-背包问题
    https://www.luogu.com.cn/problem/P1048?contestId=154692`include<bits/stdc++.h>usingnamespacestd;intv[105];intvalue[105];intdp[105][1005];intmain(){intt,m;cin>>t>>m;for(inti=1;i<=m;i++){cin>>v[i]>>......
  • 动态规划之背包DP
    2024-1-24首先是完全背包和0-1背包:同样是限制空间容量最大为m,然后有n类物品,两者的区别在于:①完全背包中每一类物品有ki个,而0-1背包中每类物品只有1个。②实现上完全背包是正序循环的,而0-1背包是逆序循环的,因为前者需要考虑装多个物品的情况(这个从转移方程可......
  • 0/1背包简单总结
    0/1背包简单总结问题:\(n\)件物品选择性放入载重为\(C\)的背包。第\(i\)件物品的重量为\(w[i]\),价值为\(v[i]\)。每个物品只有一件,你可以选择不放入背包,或者放入背包。请问该如何选择物品,在能保证物品总重量不超过背包载重的条件时,使物品的价值总和最大。解:设\(dp[i][j]\)表示......
  • 其他背包问题简单总结
    其他背包问题简单总结1.完全背包0/1背包问题:已知有第\(i\)个物品的重量\(w_{i}\),价值\(v_{i}\),以及背包的总容量\(W\)。设DP状态\(f_{i,j}\)为在只能放前\(i\)个物品的情况下,容量为\(j\)的背包所能达到的最大总价值。而完全背包,即是在\(0/1\)背包问题中,将一个物......
  • 0-1背包和完全背包,初级理解和总结
    0-1背包就是数组中元素只能取一个,完全背包就是数组中的元素能无限取。最开始接触的就是纯粹的背包问题,就是怎么装是背包价值最大,二维数组,if(j<weight[i])dp[i][j]=dp[i-1][j];elsedp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);一维数组,dp[j......
  • 0-1背包问题 初理解
    第一次做这题确实没什么思路,看了卡哥的视频也是似懂非懂,现在整理一下。首先明确变量有哪些,物品种类,单个物品重量,单个物品价值,背包的最大容量容量;这些变量该如何融入递推公式中呢?先明确题目所求的是什么,在背包容纳范围下的价值最大。为了求容量空间为N的价值最大,可以推想容量空......
  • 打包转让保温杯和小米背包,一共80元
    【社区赠品,未拆封】80元转让一个华为logo的车载保温杯,400ml,白色,304不锈钢内胆真空保温杯。保温性能好,三层防烫,食品级PP外层,杯体底部有魔力吸盘,直立可轻松拿起,若受侧方力,则会吸住,不翻倒。再赠送一个价值23.8元的小米10L双肩包【黑色,社区赠品,未拆封】。......
  • 动态规划(4) 完全背包的遍历顺序
    目录377组合总和Ⅳ进阶版爬楼梯322零钱兑换377组合总和ⅣclassSolution{public:intcombinationSum4(vector<int>&nums,inttarget){intn=nums.size();vector<int>dp(target+1,0);dp[0]=1;for(intj=0;j<=target;j++)......