题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
#include <bits/stdc++.h>
using namespace std;
const int N = 65;
int h[N],e[N],ne[N],w[N],idx,v[N];
int f[N][3210];
int n,m;
void add(int a,int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
void dfs(int u){
for(int i=m;i>=v[u];i--) f[u][i] = w[u];
//对于每个子节点,可用的体积范围为[0,m-v[u]],将每个节点看作一个物品组,进行分组背包即可
for(int i=h[u];i!=-1;i=ne[i]){
int ch = e[i];
dfs(ch);
for(int j=m;j>=v[u];j--){
for(int k=0;k<=j-v[u];k++){
f[u][j] = max(f[u][j],f[u][j-k]+f[ch][k]);
}
}
}
}
int main(){
memset(h,-1,sizeof h);
scanf("%d%d",&m,&n);
//缩小空间
m /= 10;
for(int i=1;i<=n;i++){
int cost,p,q;
scanf("%d%d%d",&cost,&p,&q);
w[i] = p*cost;
v[i] = cost/10;
if(q == 0){
//虚拟源点,将所有依赖关系转化为一颗依赖树树
add(0,i);
}else{
add(q,i);
}
}
dfs(0);
cout<<f[0][m];
return 0;
}
腾讯云智研发成长空间 229人发布
查看11道真题和解析
