P1064 金明的预算方案 (依赖性背包问题)
这道题可以用分组背包来做。
但是分组有两种方式
一种是把主件,主件+附件1,主件+附件2分成一组
组内只能选一个物品
一种是建一颗树,用树形dp的方式去做
第二种更通用,就算物品的依赖关系是森林都可以做
而第一种只限于这道题,因为只有一层关系,所以有特殊解
目前只写了第一种,后面补第二种
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 412;
const int MAXM = 32123;
int f[MAXM], p[MAXN], w[MAXN], fa[MAXN], n, m;
int W[MAXN], P[MAXN], k[MAXN], cnt, N;
void add(int w, int p)
{
W[N] = w; P[N] = p; k[N++] = cnt;
}
void init()
{
REP(i, 1, n + 1)
if(fa[i] == 0)
{
add(w[i], p[i]);
vector<int> son;
REP(j, 1, n + 1)
if(fa[j] == i)
son.push_back(j);
if(son.size() >= 1) add(w[i] + w[son[0]], p[i] + p[son[0]]);
if(son.size() >= 2)
{
add(w[i] + w[son[1]], p[i] + p[son[1]]);
add(w[i] + w[son[1]] + w[son[0]], p[i] + p[son[1]] + p[son[0]]);
}
cnt++;
}
}
int main()
{
scanf("%d%d", &m, &n);
REP(i, 1, n + 1)
{
scanf("%d%d%d", &w[i], &p[i], &fa[i]);
p[i] *= w[i];
}
init();
REP(r, 0, cnt)
for(int j = m; j >= 0; j--)
REP(i, 0, N)
if(k[i] == r && j - W[i] >= 0)
f[j] = max(f[j], f[j - W[i]] + P[i]);
printf("%d\n", f[m]);
return 0;
}
第二种
大家有没有看到这个代码和选课的树形dp的区别。(选课https://blog.csdn.net/qq_34416123/article/details/82258060)
这道题是选课的简化版,最多只有两个儿子,而且只有三层。
这份代码多了个递归参数体积。选课那题体积都为1,而cnt数组记录的是以i结尾的子树
的节点的个数,也就是体积。
#include<cstdio>
#include<algorithm>
#include<vector>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define FOR(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXN = 112;
const int MAXM = 32123;
int f[MAXN][MAXM], p[MAXN], w[MAXN], n, m;
vector<int> g[MAXN];
void dfs(int u, int k)
{
REP(i, 0, g[u].size())
{
int v = g[u][i];
FOR(j, 0, k - w[v]) f[v][j] = f[u][j];
if(k >= w[v]) dfs(v, k - w[v]);
FOR(j, w[v], k) f[u][j] = max(f[u][j], f[v][j-w[v]] + w[v] * p[v]);
}
}
int main()
{
scanf("%d%d", &m, &n);
FOR(i, 1, n)
{
int fa;
scanf("%d%d%d", &w[i], &p[i], &fa);
g[fa].push_back(i);
}
dfs(0, m);
printf("%d\n", f[0][m]);
return 0;
}
P1064 金明的预算方案 (依赖性背包问题)的更多相关文章
- 洛谷 P1064 金明的预算方案(01背包问题)
传送门:Problem 1064 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是 “01”背包问题的变形. 如果不考虑买附件必 ...
- 有依赖的背包---P1064 金明的预算方案
P1064 金明的预算方案 solution 1 暴搜 70pt dfs (当前搜到了第几个物品,产生的总价值,剩下多少钱) 剪枝 1:如果剩下的钱数<0,直接return就好,没必要继续了 剪 ...
- 【dp】P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- 洛谷 P1064 金明的预算方案(有依赖的背包问题)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- 洛谷 P1064 金明的预算方案【有依赖的分组背包】
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱 ...
- P1064 金明的预算方案 (分组背包稍稍变形)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- 洛谷P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- luogu P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- 洛谷 P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- 洛谷 P1064 金明的预算方案 (有依赖的0/1背包)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
随机推荐
- data is not None
在读django的form源码: def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=Non ...
- 发个ZKW线段树板子测试一下代码高亮
是我,Long time no see --Jim 先安利 Wolves 歌手:Madilyn Bailey http://music.163.com/song/524149464 ...
- [Atcoder Code Festival 2017 Qual A Problem D]Four Coloring
题目大意:给一个\(n\times m\)的棋盘染四种颜色,要求曼哈顿距离为\\(d\\)的两个点颜色不同.解题思路:把棋盘旋转45°,则\((x,y)<-(x+y,x-y)\).这样就变成了以 ...
- BZOJ 3786 星系探索 (splay+dfs序)
题目大意:给你一棵树,支持一下三种操作 1.获取某节点到根节点的路径上所有节点的权值和 2.更换某棵子树的父亲 3.某子树内所有节点的权值都增加一个值w 当时想到了splay维护dfs序,查完题解发现 ...
- freeswitch mod_xml_curl
(猜想)调用htttp 进行动态用户注册 流程 用户通过客户端进行注册 填写sip账号密码 进入fs, fs发送http请求配置得地址,request中带着user,key 一些参数, 服务器返回xm ...
- JS中的Set 与去重
-----------------------Set 与去重----------------------- ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值.Se ...
- [BZOJ1975]HH去散步 图论+矩阵
###[BZOJ1975]HH去散步 图论+矩阵 题目大意 要求出在一个m条边,n个点的图中,相邻两次走的边不能相同,求在t时间时从起点A走到终点B的路径方案总数.将答案mod45989 输入格式: ...
- test文件夹,测试类是放在src目录下的,test测试代码是代码啊,当然要放在代码文件夹下
test文件夹,测试类是放在src目录下的,test测试代码是代码啊,当然要放在代码文件夹下 Maven的标准工程结构 Maven的标准工程结构如下: |-- pom.xml(maven的核心配置文件 ...
- Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析
相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...
- HDU 1211
水.模拟即可.使用EXGCD求逆元 #include <iostream> #include <cstdio> #include <cstring> #includ ...