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元钱就行”. ...
随机推荐
- laravel 常用单词翻译
1.ORM:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping), 翻译为:对象关系映射. 是一种程序技术,用于实现面向对象编程语言里不同类型系统的 ...
- HYSBZ-1566 管道取珠 区间dp
题目链接:https://cn.vjudge.net/problem/HYSBZ-1566 题意 思路 已经说了,面对\sum a^2的时候把状态分两个, 当这两个状态相同时,满足题意的方案数即变为a ...
- python中方法与函数的区别与联系
今天huskiesir在对列表进行操作的时候,用到了sorted()函数,偶然情况下在菜鸟教程上看到了内置方法sort,同样都可以实现我对列表的排序操作,那么方法和函数有什么区别和联系呢? 如下是我个 ...
- STM32 关于头文件路径没添加错误问题(cannot open source input file "spi.h": No such file or directory)
error: #5: cannot open source input file "spi.h": No such file or directory 1.出现这种问题,首先要确 ...
- Bate版总结会议2
本次会议主要是针对我们在冲刺阶段出现的问题进行的讨论.再有就是以后在开发中应该改进的地方. 问题一: 工作任务不能拖:因为任务一拖就很可能无法再规定的时间内完成,如果我们可以分配好任务就去做的话,我们 ...
- 洛谷 1156 dp
洛谷1156 dp 类背包问题 老久没有自己想出来过dp方程了,,,虽然到最后还是只写了30分,,, 设dp[j]表示最大生命值为i时的最大高度,则对于每个物品,可以选择吃掉或者放上去,即转移为dp[ ...
- 简单谈谈MySQL优化利器-慢查询
慢查询 首先,无论进行何种优化,开启慢查询都算是前置条件.慢查询机制,将记录过慢的查询语句(事件),从而为DB维护人员提供优化目标. 检查慢查询是否开启 通过show variables like ' ...
- [using_microsoft_infopath_2010]Chapter5 为表单添加逻辑规则
本章概要: 1.在表单中使用逻辑和验证,不写代码 2.使用规则任务板 3.添加表单条件格式 4.通过函数和公式添加更加高级的规则 5.通过对驶入使用规则创建直观的用户界面
- C++基础学习教程(三)
承接上一讲. 2.7文件I/O 关于读写文件,C++中有一个专门的头文件<fstream>. 首先是读文件演示样例,例如以下: </pre><pre> /***** ...
- Codeforces 10A-Power Consumption Calculation(模拟)
A. Power Consumption Calculation time limit per test 1 second memory limit per test 256 megabytes in ...