#include<stdio.h>
int main(){
int n,c,i,j;
int w[100],v[100],x[100];
scanf("%d %d",&n,&c);
int m[100][100];//m[i][j] i代表可选物品为i,i+1,,,n, j代表背包容量
for(i=1;i<=n;i++){
scanf("%d %d",&w[i],&v[i]);
}
for(j=0;j<=c;j++){
if(j<w[n]) m[n][j]=0;
else m[n][j]=v[n];
}
for(i=n-1;i>0;i--){//第i行
for(j=0;j<=c;j++){
if(w[i]>j) m[i][j]=m[i+1][j];//不能装入第i件物品
else{
if(m[i+1][j]>m[i+1][j-w[i]]+v[i]){//比较装或者不装的价值
m[i][j]=m[i+1][j];
}
else m[i][j]=m[i+1][j-w[i]]+v[i];
}
}
}
int q=c;
for(i=1;i<n;i++){
if(m[i][q]==m[i+1][q]) x[i]=0;
else {
x[i]=1;
q=q-w[i];
}
}
if(m[n][q]>0) x[n]=1;
else x[n]=0;
printf("%d\n",m[1][c]);
for(i=1;i<=n;i++){
printf("%d",x[i]);
}
}
0-1背包
最新推荐文章于 2024-09-12 00:41:57 发布