背包问题

 

 

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

  

 

posted @ 2023-02-22 22:42  天雷小兔  阅读(27)  评论(0)    收藏  举报