11 2020 档案
摘要:原题链接:998. 起床困难综合症 本题是让我们选择[0,m]之间的一个整数x,经过给定的n次位运算,使结果ans最大。 位运算的主要特点之一是在二进制表示下不进位。正因为如此,在x可以任意选择的情况下从,参与位运算的各个位(bit)之间是独立无关的。换言之,对于任意的k(0<=k<30),“ans
阅读全文
摘要:原题链接:91. 最短Hamilton路径 解题思路 首先想下暴力算法,这里直接给出一个例子。 比如数据有 55 个点,分别是 0,1,2,3,4 那么在爆搜的时候,会枚举一下六种路径情况(只算对答案有贡献的情况的话): case 1: 0→1→2→3→4 case 2: 0→1→3→2→4 cas
阅读全文
摘要:原题链接:64位整数乘法 解题思路 方法一 类似快速幂的思想,把整数 b 用二进制表示,即b=c(k-1)pow(2,k-1)+c(k-2)pow(2,k-2)+......+c(0)pow(2,0),那么a*b=c(k-1)*a*pow(2,k-1)+c(k-2)*a*pow(2,k-2)+...
阅读全文
摘要:题目链接:a^b 解题思路 根据数学常识,每一个正整数可以唯一表示为若干指数不重复的2的次幂的和。也就是说,如果b在二进制表示下有k位,其中第i(0<=i<k)位的数字为ci,那么: 因为k=log2(b+1)的向上取整,所以上式乘机项的数量不多于log2(b+1)的向上取整个。又因为: pow(a
阅读全文
摘要:题目链接:背包问题求具体方案 算法一 题目要求输出字典序最小的解,假设存在一个包含第1个物品的最优解,为了确保字典序最小那么我们必然要选第一个。那么问题就转化成从2~N这些物品中找到最优解。之前的f(i,j)记录的都是前i个物品总容量为j的最优解,那么我们现在将f(i,j)定义为从第ii个元素到最后
阅读全文
摘要:题目链接:背包问题求方案数 01背包 时间复杂度O(nm) 本题求01背包的最佳方案数,那么定义两个数组:f[N],cnt[n] f[i]用来储存背包容积为i时的最佳方案的总价值 cnt[i]为背包容积为i时总价值为最佳的方案数 先初始化所有的cnt[i]为1,因为背包里什么也不装也是一种方案 外层
阅读全文
摘要:原题链接 有依赖的背包问题 题目描述 有依赖的背包问题是指物品之间存在依赖关系,这种依赖关系可以用一棵树来表示,要是我们想要选择子节点就必须连同父节点一块选。 我们可以吧有依赖的背包问题看成是分组背包问题中的一个组,子节点的每一种选择我们都看作是组内的一种物品,因此我们可以通过分组背包的思想去写。
阅读全文
摘要:题目链接acwing9 解题思路图解 通过解题思路我们可以写下如下代码 #include<bits/stdc++.h> using namespace std; const int N=110; int f[N][N]; //只从前i组物品中选,当前体积小于等于j的最大值 int v[N][N],w
阅读全文
摘要:题目链接acwing8 这道题目跟01背包问题很像,只不过是在01背包的基础加上了一个重量限制。 01背包问题的动态转移方程是 那么这个多了个重量,那么可以再开一维,变成三维 同01背包,它可以压缩亿下空间,于是变成了 状态转移方程出来了,那么写代码也轻松了. #include <bits/stdc
阅读全文
摘要:题目来源acwing7 利用多重背包的二进制优化,可以将一种被扒皮分散为多个01背包,用三个a,b,c数组来记录转换之后的所有背包,c为bool型数组,如果为true,就是完全背包,false则为01背包,最后做一遍,以c的值分类。做完全背包和01背包 #include <iostream> #in
阅读全文
摘要:题目来源:acwing6 算法1 (单调队列优化) O(NV) 一共是n类物品,背包的容量是m 每类物品的体积为v, 价值为w,个数为s 我们先来回顾一下传统的dp方程 dp[i][j] 表示将前 i 种物品放入容量为 j 的背包中所得到的最大价值 dp[i][j] = max(不放入物品 i,放入
阅读全文
摘要:原题链接AcWing5 基本思考框架 思路和多重背包问题I一样,但这题的数据范围变成1000了,非优化写法时间复杂度O(n^3) 接近 1e9必超时。 优化多重背包的优化 首先,我们不能用完全背包的优化思路来优化这个问题,因为每组的物品的个数都不一样,是不能像之前一样推导不优化递推关系的。(详情看下
阅读全文
摘要:题目来源:AcWing4 算法: (把多重背包拆成01背包)很香 C++ 代码 #include <bits/stdc++.h> using namespace std; int a[10005],b[10005]; int main() { int t=0,n,m,dp[10005]={ },w,
阅读全文
摘要:题目来源:https://www.acwing.com/problem/content/3/ 基本思考框架 C++代码 #include<iostream> using namespace std; const int N = 1010; int f[N][N]; int v[N],w[N]; in
阅读全文
摘要:题目来源https://www.acwing.com/problem/content/2/ 算法1: 二维数组+动态规划 动态规划知识先导 状态转换方程: 定义f[i][j]:前i个物品,背包容量j下的最优解 (1) 当前背包容量不够(j<w[i]),为前i-1个物品最优解: f[i][j]=f[i
阅读全文