背包路径的打印
pre[j]=j-cost[i];
背包问题求解时,
//求最大值需满足满条件时则 设f[i]为-INF,f[0]为0
//否则f[i]=0
//求最小值 设f[i]为INF,f[0]=0(不需要分满与否,若求满直接判断即可)
//完全背包
for(int i=1;i<=n;i++){
for(int j=cost[i];j<=C;j++){
f[j]=max(f[j-cost[i]]+w[i],f[j]);
}
}
//0-1背包
for(int i=1; i<=n; i++) {
for(int j=C; j>=cost[i]; j--) {
f[j]=max(f[j-cost[i]]+w[i],f[j]);
}
}
//多重背包
for(int i=1; i<=n; i++) {
for(int j=sum; j>=0; j--) {
for(int k=0; k<=c[i]; k++) {
if(k*a[i]>j)break;
f[j]=max(f[j],f[j-k*a[i]]+k*w[i]);
}
}
}
//多重背包的二进制优化
//多重背包二进制优化
vector<int>V;
vector<int>W;
for (int i = 0; i < n; ++i) {
scanf("%d%d",&m,&x,&w);
for (int j = 1; j <= m; j<<=1) {//二进制优化
V.push_back(j*x);
W.push_back(j*w);
m-=j;
}
if(m>0) V.push_back(m*x),w.push_back(m*w);//!!!别忘了剩余的数
}
for (int i = 0; i < V.size(); i++) {
for (int j = C; j >=V[i] ; --j) {
dp[j]=max(dp[j-V[i]]+W[i],dp[j]);
}
}
//分组背包(每组最多选择一个)
//i组,每组num[i]个物品,第i组第j个物品的体积为cost[i][j],价值为w[i][j]
f[0]=0; for(int i=1;i<=n;i++) for(int j=m;j>=0;j--) for(int k=1;k<=num[i];k++) if(j>=cost[i][k]) f[j] = max(f[j], f[j-cost[i][k]] + w[i][k]);