背包问题

acwing12. 背包问题求具体方案

你。 提交于 2020-01-11 06:23:58
传送门 描述 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出 字典序最小的方案。这里的字典序是指:所选物品的编号所构成的序列。物品的编号范围是 1…N。 输入格式 第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。 接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。 输出格式 输出一行,包含若干个用空格隔开的整数,表示最优解中所选物品的编号序列,且该编号序列的字典序最小。 物品编号范围是 1…N。 数据范围 0<N,V≤1000 0<vi,wi≤1000 输入样例 4 5 1 2 2 4 3 4 4 6 输出样例: 1 4 这个题要我们找字典序最小的可行答案,所以我们就可以直接通过看我们状态是如何转移过来的 因为字典序最小,所以我们可以从后往前做01背包,那么最后用的就一定是靠前的物品 然后再通过 f [ i ] [ m ] = = f [ i + 1 ] [ m − a [ i ] ] + b [ i ] f[i][m]==f[i+1][m-a[i]]+b[i] f [ i ] [ m ] = = f [ i + 1 ] [ m − a [ i ] ] + b [ i ]

POJ 3181 Dollar Dayz 【完全背包】

*爱你&永不变心* 提交于 2020-01-10 22:24:51
题意: 给出两个数,n,m,问m以内的整数有多少种组成n的方法 完全背包+大数划分 思路: dp[i][j] := 用i种价格配出金额j的方案数。 那么dp[i][0] = 1,使用任何价格配出金额0的方案个数都是1(什么都不用)。 递推关系式: 实际上是完全背包问题,只是状态转移方程形式有所不同,不过状态转移的方向是完全相同的。 dp[i][j] = dp[i – 1][j] + dp[i – 1][j – i] + dp[i – 1][j – 2 * i] + … + dp[i – 1][0] 附: 01背包完全背包详解 #include <iostream> #include <cstdio> #include <string.h> #include <string> #include <algorithm> using namespace std; unsigned long long a[105][1005],b[105][1005],inf=1; int main() { int n,m,i; for(int i=0;i<18;i++) inf*=10; while(~scanf("%d%d",&n,&m)) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(i = 0;i<=m;i++) { a[i][0] = 1

c++ 动态规划-01背包

∥☆過路亽.° 提交于 2020-01-10 03:28:57
动态规划 - 01背包问题 1.使用递归遍历(穷举)求解: 01背包问题:给定 n 种物品和一个重量(容量)(限定条件)为 w 的 背包 ,物品 i 的重量是 wi,其价值为 vi。(每种物品只有一个)问:如何选择装入 背包 的物品,使得装入 背包 中的物品的价值最大。 //VC6.0-------------------------- #include"stdafx.h" #include <cmath> #include <iostream> using namespace std; //----------全局变量------------ #define n 4 //number //物品数量 #define max_w 9 //weight //可承受重量(最大重量) int value[n]={2,3,4,5}; //物品价值 int weight[n]={3,4,5,6}; //物品重量 //最大价值 以及解向量 int max_v=0; int x[n]={0}; int nx[n]={0}; //当前解的情况 //-----------------------递归----------------------- void beibao01(int i,int v,int w) //第i个物品 总价值 总重量 { //物品已遍历完毕 if(i>n-1) return;

9动态规划

拥有回忆 提交于 2020-01-09 23:01:39
1.背包问题 音响 3000元 4斤 笔记本电脑 2000元 3斤 吉他 1500元 1斤 1.简单算法 最简单的算法:尝试各种可能的商品组合,并找出价值最高的组合。 缺点:速度非常慢。3种商品需要计算8种组合;4件商品是,需要计算16中组合。每增加一种商品,需要计算的集合数将翻倍。这种算法的运行时间为O(2 n ) 组合1 组合2 组合3 组合4 无 吉他 音响 笔记本电脑 0 1500 3000 2000 组合5 组合6 组合7 组合8 吉他和音响 吉他和笔记本电脑 音响和笔记本电脑 吉他、音响和笔记本电脑 装不下 3500 装不下 装不下 近似算法可以得到近似解,但不一定是最优解。 2. 动态规划 使用动态规划可以得到最优解。 背包的承重为1斤 背包的承重为2斤 背包的承重为3斤 背包的承重为4斤 吉他 1 1500 可以放入背包 G 1500 可以放入背包 G 1500 可以放入背包 G 1500 可以放入背包 G 1500 音响 4 3000 G 1500 G 1500 G 1500 S 3000 笔记本电脑 3 2000 G 1500 G 1500 C 2000 3000 vs (2000+1500) -> 3500 计算公式: cell[i][j] = cell[i-1][j] vs {当前商品的价值 + 剩余空间的价值 = 当前商品的价值+cell[i-1][j

acwing 8. 二维费用的背包问题

筅森魡賤 提交于 2020-01-09 14:50:12
传送门 描述 有 N 件物品和一个容量是 V 的背包,背包能承受的最大重量是 M。 每件物品只能用一次。体积是 vi,重量是 mi,价值是 wi。 求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。 输出最大价值。 输入格式 第一行两个整数,N,V,M,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。 接下来有 N 行,每行三个整数 vi,mi,wi,用空格隔开,分别表示第 i 件物品的体积、重量和价值。 输出格式 输出一个整数,表示最大价值。 数据范围 0<N≤1000 0<V,M≤100 0<vi,mi≤100 0<wi≤1000 输入样例 4 5 6 1 2 3 2 4 4 3 4 5 4 5 6 输出样例: 8 二维费用背包就比一维费用多了一个限制因素,做法还是一样的,只不过多了一层循环来比较重量 AC代码如下: #include<bits/stdc++.h> using namespace std; int a[1010],b[1010],c[1010],dp[1010][1010]; int main() { int n,V,M; cin>>n>>V>>M; for(int i=0;i<n;i++) { int v,m,w; cin>>v>>m>>w; for(int j=V;j>=v;j--){

动态规划3-贪心算法-0-1背包

拈花ヽ惹草 提交于 2020-01-07 21:28:29
参考 https://zh.wikipedia.org/wiki/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95 贪心算法 (英语: greedy algorithm),又称 贪婪算法 ,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的 算法 。 [1] 比如在 旅行推销员问题 中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。 贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。 贪心算法与 动态规划 的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。 贪心法可以解决一些 最优化 问题,如:求 图 中的 最小生成树 、求 哈夫曼编码 ……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。 贪心算法,可以针对一些不是特别复杂的问题,也就是不需要推导重来,确定子结构最优解,这个最优解就是最终解的一部分,不会像动态规划中

AcWing 5 多重背包问题 II

拥有回忆 提交于 2020-01-06 22:02:12
题目描述: 有 N 种物品和一个容量是 V的背包。第 i种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。 输入格式 第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。 接下来有 N行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i种物品的体积、价值和数量。 输出格式 输出一个整数,表示最大价值。 数据范围 0<N≤1000 0<V≤2000 0<vi,wi,si≤2000 提示: 本题考查多重背包的二进制优化方法。 输入样例 4 5 1 2 3 2 4 1 3 4 3 4 5 2 输出样例: 10 分析: 在 AcWing 4 多重背包问题 I 中我们介绍了多重背包问题的常规解法,本题我们将使用二进制优化来解决多重背包问题。多重背包问题的状态转移方程是f[i][j] = max{f[i-1][j-k*v[i]] + k*w[i]},因为每个状态都要去比较s个状态的大小才能得出,所以复杂度为O(nms),在本题的数据范围内最大运算次数是4*10^9级别的,显然会TLE。不使用单调队列优化的话,我们也可以通过降低求解每个状态需要的比较次数来降低时间复杂度。 回忆下01背包问题,n个物品排成一排,每个物品要么选要么不选,选也只能选一次

算法分类合集

二次信任 提交于 2020-01-06 08:18:08
算法分类合集 ACM 所有 算法 数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列 双端队列 可并堆 左偏堆 二叉查找树 Treap 伸展树 并查集 集合计数问题 二分图的识别 平衡二叉树 二叉排序树 线段树 一维线段树 二维线段树 树状数组 一维树状数组 N维树状数组 字典树 后缀数组,后缀树 块状链表 哈夫曼树 桶,跳跃表 Trie树(静态建树、动态建树) AC自动机 LCA和RMQ问题 KMP算法 图论 基本图算法图 广度优先遍历 深度优先遍历 拓扑排序 割边割点 强连通分量 Tarjan算法 双连通分量 强连通分支及其缩点 图的割边和割点 最小割模型、网络流规约 2-SAT问题 欧拉回路 哈密顿回路 最小生成树 Prim算法 Kruskal算法(稀疏图) Sollin算法 次小生成树 第k小生成树 最优比例生成树 最小树形图 最小度限制生成树 平面点的欧几里德最小生成树 平面点的曼哈顿最小生成树 最小平衡生成树 最短路径 有向无环图的最短路径->拓扑排序 非负权值加权图的最短路径->Dijkstra算法(可使用二叉堆优化) 含负权值加权图的最短路径->Bellmanford算法 含负权值加权图的最短路径->Spfa算法 (稠密带负权图中SPFA的效率并不如Bellman-Ford高) 全源最短路弗洛伊德算法Floyd 全源最短路Johnson算法 次短路径

分支限界

假如想象 提交于 2020-01-03 20:04:10
分支限界的基本思想 分支限界和回溯法都是在解空间树中进行搜索,但是他们的搜索方式不同,对于回溯法,他是从根节点开始以深度优先的策略进行搜索;而分支限界则是从根节点开始,以宽度优先为的方式进行搜索 分支限界通常用来找问题的一个最优解,而回溯法用来找所有的可行解 两种分支限界法 队列式(FIFO) :按照队列先进先出原则选取下一个结点为扩展结点 优先级队列式 :按照优先队列规定的优先级选取优先级最高的结点成为当前扩展结点 0-1背包问题 商品类记录没一件物品的价值(price)与重量(weight),还有单位价值(bw = price/weight) class Produce { int id = 0 ; int price ; int weight ; int bw ; //物品的单位价值 Produce ( int price , int weight , int id ) { this . id = id ; this . price = price ; this . weight = weight ; bw = price / weight ; } } 背包类,记录背包的状态,最初什么也不装的背包是一种状态,装了某一个物品和不装该物品又是不同的状态 //背包类,用来记录当前的背包状态 class Bag { int totalPrice ; //背包内的总价值 int

动态规划 ——0-1背包问题(1)

回眸只為那壹抹淺笑 提交于 2019-12-31 21:42:55
0-1背包问题 本文内容来来源于《计算机算法设计与分析》(王晓东著),是笔者的学习笔记,内容不当处,欢迎留言探讨 问题描述:给定n中物品和一背包,物品i的重量是 w i w_i w i ​ ,价值为 v i v_i v i ​ ,背包容量为c。应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。 目标函数: m a x ∑ i = 1 n v i x i max\sum_{i=1}^{n}v_ix_i m a x i = 1 ∑ n ​ v i ​ x i ​ 即装入背包中的物品价值达到最大。 约束条件: ∑ i = 1 n v i x i < c \sum_{i=1}^{n}v_ix_i<c ∑ i = 1 n ​ v i ​ x i ​ < c ,即装入背包中的物品总重量小于背包的容量。 好吧,其实我看到这里已经要睡着了,脑子里想到的画面是装到背包里的东西,和重量有个线球关系,你该考虑的不该是体积么,反正我装背包,从来不担心重量。不过不要紧,清醒一下,洗把脸,心里默念,去~~~的 1、最优子结构 动态规划的本质是对问题进行分解,对每个子问题求解,从而得到原问题的解,当然,其灵魂是建立一个表格,或者什么都行,存储一部分子问题的解,避免进行重复计算。 设 ( y 1 , y 2 . . . y n ) (y_1,y_2...y_n) ( y 1 ​ , y 2 ​ . .