背包问题

1.01背包
for(int i=1;i<=n;i++){
for(int j=V;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
2.完全背包
for(int i=1;i<=n;i++){
for(int j=v[i];j<=V;j++){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
3.1.多重背包(不优化)
for(int i=1;i<=n;i++){
for(int k=1;k<=s[i];k++){
for(int j=V;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
}
3.2.多重背包(优化)
for(int i=1;i<=n;i++){
if(s[i]*v[i]>=V){
for(int j=v[i];j<=V;j++){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}else{
for(int j=V;j>=v[i];j--){
for(int k=s[i];k>=0;k--){
if(j>=k*v[i]){
dp[j]=max(dp[j],dp[j-k*v[i]]+k*w[i]);
}
}
}
}
}
4.分组背包
for(int i=1;i<=n;i++){
for(int j=m;j>=0;j--){
for(int k=0;k<=p[i];k++){
if(j>=v[i][k]){
dp[j]=max(dp[j],dp[j-v[i][k]]+w[i][k]);
}
}
}
}
5.混合背包
for(int i=1;i<=n;i++){
if(s[i]==0){
for(int j=v[i];j<=m;j++){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}else if(s[i]==-1){
for(int j=m;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}else{
for(int j=1;j<=s[i];j++){
for(int k=m;k>=v[i];k--){
dp[k]=max(dp[k],dp[k-v[i]]+w[i]);
}
}
}
}
6.多维背包
for(int i=1;i<=n;i++){
for(int j=V;j>=v[i];j--){
for(int k=M;k>=m[i];k--){
dp[j][k]=max(dp[j][k],dp[j-v[i]][k-m[i]]+w[i]);
}
}
}
7.求背包方案数
for(int i=1;i<=n;i++){
int v,w;
cin>>v>>w;
for(int j=V;j>=v;j--){
int temp,sum=0;
temp=max(dp[j],dp[j-v]+w);
if(temp==dp[j])sum+=g[j];
if(temp==dp[j-v]+w)sum+=g[j-v];
if(sum>=MOD)sum%=MOD;
dp[j]=temp;
g[j]=sum;
}
}
8.求背包具体方案
for(int i=n;i>=1;i--){
for(int j=0;j<=V;j++){
dp[i][j]=dp[i+1][j];
if(j>=v[i])dp[i][j]=max(dp[i][j],dp[i+1][j-v[i]]+w[i]);
}
}
int ks=V;
for(int i=1;i<=n;i++){
if(ks>=v[i]&&dp[i][ks]==dp[i+1][ks-v[i]]+w[i]){
cout<<i<<' ';
ks-=v[i];
}
}

浙公网安备 33010602011771号