题目链接:https://www.luogu.org/problemnew/show/P1064 这是一个有依赖的背包问题,属于01背包的变式.这题还好,每个主件最多有2个附件,那么在对主件进行背包的时候,决策就不再是两个,而是五个. 01背包的决策: 不选; 选; 这个题目的决策: 不选; 只选主件; 选主件和附件1; 选主件和附件2; 选主件,附件1和附件2; 这里需要先判断选附件的决策是不是可行,即如果当前容量能放下附件1或附件2或附件1和附件2,才考虑状态转移. 因此这题的状态转移方程有…
题面 树形 DP 的经典问题. 我们设 \(dp_{i,j}\) 表示当前节点为 \(i\),当前节点的子树(包含当前节点)最多装的体积是 \(j\) 的最大价值. 我们遍历节点的过程就相当于做了一遍分组背包. 注意遍历完所有子节点后要更新一下状态. #include <bits/stdc++.h> using namespace std; const int maxn = 103; int n, m; int tot, head[maxn], ver[maxn * 2], nxt[maxn…
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 打印机,扫描仪 书柜 图书 书桌 台灯,文具 工作椅 无 如果要买归类为附件的物品,必须先买该附件所属的主件.每个主件可以有0个.1个或2个附件.附件不再有从属于…
#include <cstring> #include <iostream> #include <algorithm> using namespace std; ; int n, m; int v[N], w[N]; int h[N], e[N], ne[N], idx; int f[N][N]; //f[i,j]表示所有从以i为根的子树中选,且总体积不超过j的方案 void add(int a, int b) { e[idx] = b, ne[idx] = h[a],…
题意:       给你一些物品,每个物品有自己的价值和花费,每个物品都对应一个箱子,每个箱子有价钱,买这个物品必须买相应的箱子,给你一个价钱,问最多可以获得多少价值 <提示:多个物品可能同时对应着一个箱子>. 思路:       典型的有依赖的背包,每个箱子是"主件" 每个箱子所对应的物品是他的"附件",有依赖的背包的过程就是把没一组主件和附件的集合中附件跑一遍01背包,然后把主件强加到跑完后的数组里,然后再在虽有的集合中选择最优的dp[i]的值,这样…
这题真的神奇了……蜜汁复杂度(`・ω・´) 应该是一个比较连贯的思维方式:去掉一个物品,那么我们转移的时候不考虑它就好了呗.考虑暴力:每一次都对剩余的n - 1个物品进行多重背包转移,获得答案.既然可以优化,就说明一定有重复计算的地方——画出一张方格图,把不需要的格子涂掉——我们突然发现每一个可以有两部分组成,而两部分可以递推得到!那就很简单了:A[i][]表示选择n ~ i 这些物品能获得的最大值,B[i][]表示选择1~i的物品所能获得的最大值. 答案就是两部分的AB数组暴力合并即可. #i…
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 打印机,扫描仪 书柜 图书 书桌 台灯,文具 工作椅 无 如果要买归类为附件的物品,必须先买该附件所属的主件.每个主件可以有0个.1个或2个附件.附件不再有从属于…
1 # include<iostream> 2 # include<cstring> 3 # include<algorithm> 4 using namespace std; 5 const int N = 110; 6 7 int e[N], ne[N], idx; 8 int h[N]; 9 int v[N], val[N]; 10 int n, m; 11 int f[N][N]; 12 13 void add(int a, int b) { 14 e[idx]…
问题一:01背包 题目: [题目描述] 一个旅行者有一个最多能装 M 公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,...,Wn它们的价值分别为C1,C2,...,Cn求旅行者能获得最大总价值. [输入] 第一行:两个整数,MM(背包容量,M≤200)和NN(物品数量,N≤30): 第2..N+12..N+1行:每行二个整数Wi,CiWi,Ci,表示每个物品的重量和价值. [输出] 仅一行,一个数,表示最大总价值. [输入样例] 10 4 2 1 3 3 4 5 7 9 [输出样例]…
这道题没有什么可说的,先统计,然后几次快排,答案就出来了 Code(整齐但不简洁的代码) #include<iostream> #include<cstdio> #include<fstream> #include<cstring> #include<queue> #include<algorithm> using namespace std; typedef bool boolean; template<typename T&…