AcWing 10 有依赖的背包问题

匿名 (未验证) 提交于 2019-12-02 23:43:01

NV

物品之间具有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点。

如下图所示:

如果选择物品5,则必须选择物品1和2。这是因为2是5的父节点,1是2的父节点。

iviwipi1N1…N。

求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。

输出最大价值。

输入格式

NVN,V,用空格隔开,分别表示物品个数和背包容量。

N
ivi,wi,pivi,wi,pi,用空格隔开,分别表示物品的体积、价值和依赖的物品编号。
pi=1

输出格式

输出一个整数,表示最大价值。

数据范围

1N,V1001≤N,V≤100
1vi,wi1001≤vi,wi≤100

父节点编号范围:

  • 内部结点:1piN1≤pi≤N;
  • pi=1

输入样例

5 7 2 3 -1 2 2 1 3 5 1 4 7 2 3 6 2 

输出样例:

11背包九讲中有依赖的背包问题
#include<cstdio> #include<cstring> #include<algorithm> using namespace std;  const int maxn = 105; int N, V, p, root, ind=0; int v[maxn], w[maxn]; int ch[maxn], nxt[maxn], pre[maxn]; int dp[maxn][maxn];  void add(int p,int i){     ch[ind] = i;     nxt[ind] = pre[p];     pre[p] = ind++; } void dfs(int u){     for(int i=pre[u];i!=-1;i=nxt[i]){         int son = ch[i];         dfs(son);         for(int j=V-v[u];j>=v[son];j--)             for(int k=v[son];k<=j;k++)                 dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[son][k]);     }     for(int i=V;i>=v[u];i--)         dp[u][i] = dp[u][i-v[u]]+w[u];     //for(int i=0;i<v[u];i++)     //    dp[u][i] = 0; } int main(){     memset(pre,-1,sizeof(pre));     scanf("%d%d",&N,&V);     for(int i=1;i<=N;i++){         scanf("%d%d%d",&v[i],&w[i],&p);         if(p==-1)             root = i;         else             add(p,i);     }     dfs(root);     printf("%d\n",dp[root][V]);     return 0; }
View Code

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!