王粲

题目链接: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;
}
posted @ 2025-04-14 19:40  Marinaco  阅读(18)  评论(0)    收藏  举报
//雪花飘落效果