二进制分组背包求条0pts

#include<bits/stdc++.h>
#define int long long
using namespace std;
int v,w,m,n,w1,V[100005],W[100005],cnt,dp[100005];
signed main(){
	cin>>n>>w1;
	for(int i=1;i<=n;i++){
		cin>>v>>w>>m;
		for(int j=1;j<=m;j*=2){
			V[++cnt]=j*v;
			W[cnt]=j*w;
			m-=j;
		}
		if(m) V[++cnt]=v*m,W[cnt]=w*m;
	}
	for(int i=1;i<=cnt;i++){
		for(int j=w1;j>=V[i];j--){
			dp[j]=max(dp[j],dp[j-V[i]]+W[i]);
		}
	}
	cout<<dp[w1];
	return 0;
}

image
(点图片看题)

1 个赞

我真菜,V和W写反。
@栗子酱 关帖

1 个赞