有依赖的背包最好理解的题就是NOIP的金明的预算方案,其每个物品有主件和附件,附件必须在主件已经购买了的请款下才能购买,这里牵扯到有依赖的背包的一个问题,将这些进行分组之后就有多种情况即:不能购买主件,只能购买主件,能购买主件和多个附件,这些情况组成了多个可能的情况,
所以这种情况可以先将一个组当中的附件进行一次01背包得到其背包容量为0~V-w[i]时的所有可能情况,然后将整个组当成一个分组背包的一组看待,即此时的组里只需要选择一个可能性即可
我总结了下打出了一个模板,能简单包含这种题型,尤其时像金明的预算方案这样的题稍加修改就能通过:
模板奉上:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//简易模板适用于被依赖的物品不能再成为别的物品的附件
struct node
{
long long w, v;
}a[1005];
int d[1005];
vector<node>group[1005];
int n, m;
long long dp[1005];
void DP(vector<node>d)
{
if (d.size() > 1)//有附件
{
int k = m - d[0].w;//除了主件剩下的q空间
long long *st;
st = new long long[k];
memset(st, 0, sizeof st);
for (int i = 1; i < d.size(); i++)//将附件进行组合,组合成多种可能
{
for (int j = k; j >= d[i].w; j++)
st[j] = max(st[j], st[j - d[i].w] + d[i].v);
}
for (int i = m; i >= 0; i--)//剩下的钱,作为分组背包计算
{
if (i >= d[0].w)//能买主件
{
for (int j = 0; j <= k; j++)

本文深入解析了有依赖的背包问题,以NOIP金明的预算方案为例,阐述了主件与附件的购买策略。通过分组讨论,提出了处理有依赖背包问题的有效算法,并分享了一个适用的代码模板。
&spm=1001.2101.3001.5002&articleId=100080301&d=1&t=3&u=3e68159b653a415aa0826e206c0ba719)
2645

被折叠的 条评论
为什么被折叠?



