王粲
题目链接:https://ac.nowcoder.com/acm/contest/106859/F
题意:
n个数组,每组分别有价值不同,重量不同的若干张牌,和一张桃(其价值为x,重量为y)
初始背包容量为0,可以通过吃桃使背包容量+1
顺序不分先后,求能获得的牌的最大价值
思路:
分组背包
设f数组:f[i][j][k]:第i组,能拿总重量为j,吃了k个桃 时能获得的最大价值
1.吃桃:f[i][j][k]=max(f[i-1][j][k-1]+0,f[i][j][k])
2.不吃桃:f[i][j][k]=max(f[i-1][j-w][k]+val,f[i][j][k])
其中val和w为遍历到的该组某个物品的价值和重量
当k>=j,即符合题意时ans和f取max即可
struct node{
int val;
int w;
};
vector<node>a[105];
int f[105][105][105];
void solve(){
int n,x,y;cin>>n>>x>>y;
for(int i=1;i<=n;i++){
// a[i].pb({0,-1});
a[i].pb((node){x,y});
int c;cin>>c;
vector<int>val(c+1);
for(int j=1;j<=c;j++){
cin>>val[j];
}
for(int j=1;j<=c;j++){
int w;cin>>w;
a[i].pb((node){val[j],w});
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
for(int k=0;k<=i;k++){
for(int s=0;s<a[i].size();s++){
int val=a[i][s].val,w=a[i][s].w;
if(k>=1)f[i][j][k]=max(f[i-1][j][k-1],f[i][j][k]);
if(j>=w&&k<i)f[i][j][k]=max(f[i-1][j-w][k]+val,f[i][j][k]);
if(k>=j){
ans=max(f[i][j][k],ans);
}
}
}
}
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号