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;
}

浙公网安备 33010602011771号