有 n 個物品和乙個容量是 v 的揹包。
物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父節點。
如下圖所示:
如果選擇物品5,則必須選擇物品1和2。這是因為2是5的父節點,1是2的父節點。
每件物品的編號是 i,體積是 vi,價值是 wi,依賴的父節點編號是 pi。物品的下標範圍是 1…n。
求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。
輸出最大價值。
輸入格式
第一行有兩個整數 n,v,用空格隔開,分別表示物品個數和揹包容量。
接下來有 n 行資料,每行資料表示乙個物品。
第 ii 行有三個整數 vi,wi,pi,用空格隔開,分別表示物品的體積、價值和依賴的物品編號。
如果 pi=−1,表示根節點。 資料保證所有物品構成一棵樹。
輸出格式
輸出乙個整數,表示最大價值。
資料範圍
1≤n,v≤100
1≤vi,wi≤100
父節點編號範圍:
內部結點:1≤pi≤n;
根節點 pi=−1pi=−1
;輸入樣例57
23-1
2213
5147
2362
輸出樣例:
11
#include
#include
#include
using
namespace std;
const
int n =
110;
int n,m;
int h[n]
,e[n]
,ne[n]
,idx;
int v[n]
,w[n]
,f[n]
[n];
void
add(
int a,
int b)
void
dfs(
int u)}}
}int
main()
else
}dfs
(root)
; cout<
[m]<
return0;
}
#include
#include
#include
using
namespace std;
const
int n =
110;
int n, m;
int v[n]
, w[n]
;int h[n]
, e[n]
, ne[n]
, idx;
int f[n]
[n];
void
add(
int a,
int b)
void
dfs(
int u)
// 將物品u加進去
for(
int i = m; i >= v[u]
; i --
) f[u]
[i]= f[u]
[i - v[u]
]+ w[u]
;for
(int i =
0; i < v[u]
; i ++
) f[u]
[i]=0;
//注意清0
}int
main()
dfs(root)
; cout << f[root]
[m]<< endl;
return0;
}
有依賴的揹包問題
簡化的問題 這種揹包問題的物品間存在某種 依賴 的關係。也就是說,i依賴於j,表示若選物品i,則必須選物品j。為了簡化起見,我們先設沒有某個物品既依賴於別的物品,又被別的物品所依賴 另外,沒有某件物品同時依賴多件物品。演算法 這個問題由noip2006金明的預算方案一題擴充套件而來。遵從該題的提法,...
有依賴的揹包問題
第二天叫醒我的不是鬧鐘,是夢想!有 n 個物品和乙個容量是 v 的揹包。物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父節點。如果選擇物品5,則必須選擇物品1和2。這是因為2是5的父節點,1是2的父節點。每件物品的編號是 i,體積是 vi,價值是 wi,依賴的父節...
有依賴的揹包問題
題目鏈結 有 n 個物品和乙個容量是 v 的揹包。物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父節點。如下圖所示 如果選擇物品5,則必須選擇物品1和2。這是因為2是5的父節點,1是2的父節點。每件物品的編號是 i,體積是 vi,價值是 wi,依賴的父節點編號是 ...