洛谷P1782 旅行商的背包】的更多相关文章

题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能获得尽量多的收益呢?作为一名大神犇,他轻而易举的解决了这个问题. 然而,就在他出发前,他又收到了一批奇货.这些货共有m件,第i件的价值Yi与分配的体积Xi之间的关系为:Yi=ai*Xi^2+bi*Xi+ci.这是件好事,但小S却不知道怎么处理了,于是他找到了一位超级神犇(也就是你),请你帮他解决这个…
传送门啦 这个题不用二进制优化的话根本不行,现学的二进制优化,调了一段时间终于A了,不容易.. 如果不懂二进制优化的话可以去看我那个博客 二进制优化多重背包入口 不想TLE,不要打memset,一定要用快读,听别人说不用快读卡三个点,幸亏我习惯打快读. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const…
题目链接(卡常背包) 朴素的多重背包是: \(f[i][j] = \max\{ f[i-1][j-k*v[i]]+k*w[i] \}\),复杂度 \(O(nV*\sum num_i)\) 可以发现求\(\max\)时有很多值是被重复枚举过的 换一种方程表示形式,对于每个\(v[i]\),设\(j=K*v[i]+r,\quad K=j/v[i],\quad r=j\%v[i]\),即按照\(\%v[i]\)的余数分别进行dp(第二层枚举余数\(r\)) 再枚举\(k=0\sim K-1\)(去掉\…
题目: P1523 旅行商简化版 解析 可以看做是两个人同时从西往东走,经过不一样的点,走到最东头的方案数 设\(f[i][j]\)表示一个人走到i,一个人走到j的最短距离(\(i<j\)) 第\(j+1\)个位置,两个人都可能走,两种情况 \(f[i][j+1]=min\{f[i][j+1],f[i][j]+dis[j][j+1]\}\)位置在j的人走到了j+1位置 \(f[j][j+1]=min\{f[j][j+1],f[i][j]+dis[i][j+1]\}\)位置在i的人走到了j+1位置…
题目传送门 卡常背包果然名不虚传 算法主体就是两种背包分开跑,先跑多重背包,再跑奇货 不知道为什么,这题二进制拆分好像要比单调队列优化快一些 然后这题毒瘤的地方就出来了: 如果一件物品的体积\(\times\)数量\(>\)背包体积,那么不用二进制拆分,当成完全背包来跑 快读一定要加 用自带的max函数也可能会T,最好手写\(if\)(这数据是得有多毒瘤) 真是一道很\((\tt{du})\)好\((\tt{liu})\)的背包题目啊 代码: #include<iostream> #in…
洛谷 P2014 选课(树形背包) 思路 题面:洛谷 P2014 如题这种有依赖性的任务可以用一棵树表示,因为一个儿子要访问到就必须先访问到父亲.然后,本来本题所有树是森林(没有共同祖先),但是题中的节点\(0\)其实就可以当做一个LCA,从节点\(0\)开始dp. 状态定义:\(dp[x][m]\)x节点,选则m课,获得的最大学分 决策时,类比背包,遍历每一个状态,用儿子的状态更新 dp转移方程(已优化一维): \[ dp[x][i] = max{dp[x][i-j]+dp[son(x)][j…
P1523 旅行商简化版 题目背景 欧几里德旅行商\((Euclidean Traveling Salesman)\)问题也就是货郎担问题一直是困扰全世界数学家.计算机学家的著名问题.现有的算法都没有办法在确定型机器上在多项式时间内求出最优解,但是有办法在多项式时间内求出一个较优解. 为了简化问题,而且保证能在多项式时间内求出最优解,\(J.L.Bentley\)提出了一种叫做\(bitonic\) \(tour\)的哈密尔顿环游.它的要求是任意两点\((a,b)\)之间的相互到达的代价\(di…
题目传送门:洛谷 P4389. 题意简述: 有 \(n\) 个物品,每个物品都有无限多,第 \(i\) 个物品的体积为 \(v_i\)(\(v_i\le m\)). 问用这些物品恰好装满容量为 \(i\) 的背包的方案数,两个方案不同当且仅当存在某一个物品的选取数量不同. 你需要对 \(i\in [1,m]\) 回答,答案对 \(998,244,353\) 取模. 题解: 对于一个体积为 \(v\) 的物品,它装满容量为 \(x\) 的背包的方案数序列为 \(a_x=[v|x]\). 例如 \(…
题目链接戳这里 题目描述 有\(n\)件不同的商品,每件物品都有无限个,输出总体积为\([1,m]\)的方案数 思路 直接跑背包有\(30\) 考虑把每个物品的生成函数设出来,对于一件体积为\(v\)的物品: \[f(x)=1+x^v+x^{2v}+\cdots +x^{kv}+\cdots \] 那么答案\(F(x)\)就是每个物品的\(f\)卷起来: \[F(x)=\prod\limits_{i=1}^{n}f_i(x)=\prod\limits_{i=1}^{n}\frac{1}{1-x^…
[题目描述:] 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每一包都有它的体积Vi(l≤Vi≤C).约翰只能整包购买, 他最多可以运回多少体积的干草呢? [输入格式:] Line 1: Two space-separated integers: C and H Lines 2..H+1: Each line describes the volume of a singl…
[题目描述:] 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. [输入格式:] 输入一个正整数S. [输出格式:] 输出最大的约数之和. [算法分析:] 01背包,每个数的约数和为其价值,数的大小为其花费 注意1的价值应该为0 [Code:] #include<iostream> #include<cstdio> using namespace std; int n, v[1001], f[1001]; int work(int x) { if(x =…
题目大意:求解 0-1 背包前 K 优解的和. 题解:首先,可知对于状态 \(dp[j]\) 来说,能够转移到该状态的只有 \(dp[j],dp[j-w[i]]\).对于 K 优解来说,只需对状态额外增加一个维度即可.接着,考虑状态转移的过程,即:需要从 \(dp[j][1...k]\rightarrow dp[j][1...k],dp[j-w[i]][1...k]\rightarrow dp[j][1...k]\),可以考虑每次取出两堆数中的最大值进行比较,取较大的给当前状态,时间复杂度较高.…
题目链接:https://www.luogu.org/problemnew/show/P1757#sub 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少. 输入输出格式 输入格式: 两个数m,n,表示一共有n件物品,总重量为m 接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数 输出格式: 一个数,最大的利用价值 输入输出样例 输入样例#1:…
P4389 付公主的背包 题目背景 付公主有一个可爱的背包qwq 题目描述 这个背包最多可以装\(10^5\)大小的东西 付公主有\(n\)种商品,她要准备出摊了 每种商品体积为\(V_i\),都有\(10^5\)件 给定\(m\),对于\(s\in [1,m]\),请你回答用这些商品恰好装\(s\)体积的方案数 输入输出格式 输入格式: 第一行\(n,m\) 第二行\(V_1\sim V_n\) 输出格式: \(m\)行,第\(i\)行代表\(s=i\)时方案数,对\(998244353\)取…
P4495 [HAOI2018]奇怪的背包 题目描述 小\(C\)非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数\(P\),当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对\(P\)取模后的结果. 现在小\(C\)有\(n\)种体积不同的物品,第\(i\)种占用体积为\(V_i\),每种物品都有无限个. 他会进行\(q\)次询问,每次询问给出重量\(w_i\),你需要回答有多少种放入物品的方案,能将一个初始为空的背包的重量变为\(w_i\).注意,两种方案被认为是不同的,…
题意 题目链接 Sol 很显然的dp,设\(f[i][j]\)表示第\(i\)个位置,高度为\(j\)的最小步数 向上转移的时候是完全背包 向下转移判断一下就可以 #include<bits/stdc++.h> #define Fin(x) {freopen(x, "r", stdin);} #define chmin(a, b) (a = (a < b ? a : b)) //#define int long long using namespace std; co…
传送门 蠢了……还以为背包只能用来维护方案数呢……没想到背包这么神奇…… 我们用$dp[i]$表示当$c$的和为$i$时,所有的方案中使得最小的$b$最大时最小的$b$是多少 然后把所有的点按照$a$排序,询问按照$m$排序 然后跑一遍背包,如果$dp[q[i].k]>q[i].s+q[i].m$,即存在方案使得$c$的和为$q[i].k$且所有的$b$都大于$q[i].s+q[i].m$,那么这个询问就是可行的 但这个时间复杂度……我实在不明白为什么它能跑出来……而且好像还很快的样子……明明理…
题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少. 输入输出格式 输入格式: 两个数m,n,表示一共有n件物品,总重量为m 接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数 输出格式: 一个数,最大的利用价值 输入输出样例 输入样例#1: 45 3 10 10 1 10 5 1 50 400 2 输出样例…
先上题目链接:P1616 疯狂的采药 然后放AC代码: #include<bits/stdc++.h> #define ll long long using namespace std; ll f[]; ll timee[]; ll w[]; int main() { ll t,m; cin>>t>>m;//t总时间,m总草药 //time时间,w价值 ;i<=m;i++) { scanf("%lld",&timee[i]); scan…
题目链接:P1060 开心的金明 基本思路: 基本上和01背包原题一样,不同点在于这里要的是最大重要度*价格总和,我们之前原题是 f[j]=max(f[j],f[j-v[i]]+p[i]); 那么这里直接改成f[j]=max(f[j],f[j-v[i]]+v[i]*p[i]);就好了 其中f[j]代表的意义是当给定初始金币为j时重要度*价格的最大总和,也就是价值那里在这题变成了重要度*价格 再比较一下看看? 原题:f[j]=max(f[j],f[j-v[i]]+p[i]); 这题:f[j]=ma…
题目直接放链接 P1048 采药 这题只是01背包+背景故事而已 原题来的 PS:我写了一篇很详细的01背包说明,如果下面ac代码有看不懂的地方可以去看看 对01背包的分析与理解(图文) 下面上ac代码: #include<bits/stdc++.h> #define ll long long using namespace std; ll f[]; ll timee[]; ll w[]; int main() { ll t,m; cin>>t>>m;//t总时间,m总…
P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少. 输入输出格式 输入格式: 两个数m,n,表示一共有n件物品,总重量为m 接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数 输出格式: 一个数,最大的利用价值 输入输出样例 输入样例#1: 复制 45 3 10 10 1 10…
P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少. 输入输出格式 输入格式: 两个数m,n,表示一共有n件物品,总重量为m 接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数 输出格式: 一个数,最大的利用价值 输入输出样例 输入样例#1: 复制 45 3 10 10 1 10…
一道水题,但看到好久没有发博客了,再一看是一道noip普及组t4,就做了. 题目链接 https://www.luogu.org/problemnew/show/P1049 解题思路 一道裸的01背包,注意价值和重量是一个东西,且最后输出剩余的体积. 随随便便二维就AC了,懒得写一维. AC代码 #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #include&l…
P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少. 输入输出格式 输入格式: 两个数m,n,表示一共有n件物品,总重量为m 接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数 输出格式: 一个数,最大的利用价值 输入输出样例 输入样例#1: input: 45 4 10 10 1…
题目描述 有一个箱子容量为VVV(正整数,0≤V≤200000 \le V \le 200000≤V≤20000),同时有nnn个物品(0<n≤300<n \le 300<n≤30,每个物品有一个体积(正整数). 要求nnn个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入格式 111个整数,表示箱子容量 111个整数,表示有nnn个物品 接下来nnn行,分别表示这nnn个物品的各自体积 输出格式 111个整数,表示箱子剩余空间. 输入输出样例 输入 #1 24 6 8 3 1…
题目传送门 解题思路: 可以转化成0-1背包来做,但暴力转化的话,时间不允许.所以就用了一个二进制划分的方法,将m个物品分成2,4,8,16,32......(2的次方)表示,可以证明这些数通过一定组合可以表示任何数.然后跑0-1背包即可. AC代码: #include<iostream> #include<cstdio> using namespace std; ],w[],f[],num,tot,_c,_w; int main() { scanf("%d%d"…
无限背包+容斥? 观察数据范围,可重背包无法通过,假设没有数量限制,利用用无限背包 进行预处理,因为实际硬币数有限,考虑减掉多加的部分 如何减?利用容斥原理,减掉不符合第一枚硬币数的,第二枚,依次类推 加上不符第一枚和第二枚的方案,第一枚和第三枚的方案以此类推,不明 白原理可以去看一下容斥原理 较长代码(懒得优化) #include<iostream> #include<cstdio> #include<cstring> #include<string> #…
题目链接 题目大意 给你 n块木板(n<=40),每块木板长度为\(l[i]<=40\) 每块木板都要用,求最大的三角形面积×100,答案直接舍去小数 题目思路 首先如果已知三条边的长度可以直接用海伦公式求出三角形面积 \(p=(a+b+c)/2\) \(s=\sqrt{p*(p-a)*(p-b)*(p-c)}\) 显然你只要知道两条边的长度,你就可以直接剩下边的长度. 这个题目有点类似于给你几个数,你是否可以组成另一个数,这个就是显然的01背包 这个只是看能否组成两条边,只是多了一重循环,本…
传送门 同样是回过头来发现不会做了,要加深一下记忆. 思路 只要听说过生成函数的人相信第一眼都可以想到生成函数. 所以我们要求 \[ ans=\prod \sum_n x^{nV}=\prod \frac{1}{1-x^V} \] 也就是\(\prod (1-x^V)\). 但这玩意好像还是不会做,怎么办呢? 按照套路,可以先\(\ln\)一下,加起来,再\(\exp\)回去. 所以现在要求 \[ \sum \ln(1-x^V) \] -- -- -- 不会. 不会怎么办? 打表找规律! 经过打…