头像

欢迎来到我的博客

分享题解与总结

T781743 金发女孩

题目

T781743 金发女孩 - 洛谷

图解

金发女孩

代码

二维数组写法

int n,m,w[N],l[N],r[N];
int dp[N][N];

void dfs(int i,int j)//商品:i,背包容量:j 
{
	if(i==0) return;//不要加j==0,否则没选的商品没有输出0! 
	if(r[i]>j||dp[i-1][j]==dp[i][j]){//没选 
		dfs(i-1,j);
		cout<<0<<" ";
	}
	else{
		dfs(i-1,j-r[i]);
		cout<<1<<" ";
	}
}

int main()
{
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		cin>>w[i]>>l[i]>>r[i];
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			if(r[i]>j) dp[i][j]=dp[i-1][j];
			else dp[i][j]=max(dp[i-1][j],dp[i-1][j-r[i]]+w[i]);
		}
	}
	cout<<dp[n][m]<<"\n";
	dfs(n,m);
	return 0;
}

滚动数组写法

int n,m,w[N],l[N],r[N],dp[N]; 
int ans[N]; 

int main()
{
	vector<int> vis[N];
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%d %d %d",&w[i],&l[i],&r[i]);
	}
	for(int i=1;i<=n;++i){
		for(int j=m;j>=1;--j){
			if(r[i]<=j){//选择:装/不装 
				if(dp[j]<=dp[j-r[i]]+w[i]){
					dp[j]=dp[j-r[i]]+w[i];
					vis[j]=vis[j-r[i]];
					vis[j].push_back(i);
				}
			}
			if(i==n&&j==m) break;
		}
	}
	printf("%d\n",dp[m]);
	for(int k:vis[m]){
		ans[k]=1;
	}
	for(int i=1;i<=n;++i) printf("%d ",ans[i]);
	return 0;
}

posted @ 2026-07-14 10:19  king_steph1209  阅读(6)  评论(0)    收藏  举报