[Clasificación dinámica] 01 mochila con accesorios: plan de adquisición de Jinmin

Suponiendo que se alcanza el i-ésimo componente principal, actualmente hay 5 opciones:

(1) No compre nada (2) Compre solo la parte principal (3) Compre la parte principal y el accesorio 1 (4) Compre la parte principal y el accesorio 2 (5) Compre la parte principal, el accesorio 1 y el accesorio 2

Diseño de la estructura de datos:

Use arreglos bidimensionales v[i][0], v[i][1], v[i][2] para representar el valor de la i-ésima pieza principal, el valor del primer accesorio de la i-ésima pieza principal. ª pieza principal, y el valor del primer accesorio de la i-ésima pieza principal El valor de la parte principal y el segundo accesorio de la i parte.

Use arreglos bidimensionales w[i][0], w[i][1], w[i][2] para representar la importancia del i-ésimo componente principal y la importancia del primer accesorio del i-ésimo th componente principal, la importancia del segundo accesorio del i-th componente principal.

dp[i][j]: Representa el valor máximo de los primeros i componentes principales en el caso de j

dp[i][j]=máx( dp[i-1][j],

dp[i-1][jv[i][0]]+v[i][0]*w[i][0],

dp[i-1][jv[i][0]-v[i][1]]+v[i][0]*w[i][0]+v[i][1]*w[ yo][1],

dp[i-1][jv[i][0]-v[i][2]]+v[i][0]*w[i][0]+v[i][2]*w[ yo][2],

dp[i-1][jv[i][0]-v[i][1]-v[i][2]]+v[i][0]*w[i][0]+v[ i][1]*w[i][1]+v[i][2]*w[i][2])

#include<iostream>
using namespace std;
int dp[32001];
int v0[61];
int p0[61];
int v1[61];
int p1[61];
int v2[61];
int p2[61];
int n,m;
int main(){
	cin>>n>>m;
	int v,p,q;
	int cnt=1;
	for(int i=1;i<=m;i++){
		cin>>v>>p>>q;
		if(q==0){
			v0[i]=v;
			p0[i]=p;
		}
		else if(v1[q]==-1)
			{
			v1[q]=v;
			p1[q]=p;
		}
		else{
			v2[q]=v;
			p2[q]=p;
		}
	}
	for(int i=1;i<=m;i++){
		for(int j=n;j>=v0[i]&&v0[i]!=0;j--){
			if(j>=v0[i]){
				dp[j]=max(dp[j],dp[j-v0[i]]+v0[i]*p0[i]);}
			else if(j>=v0[i]+v1[i]){
				dp[j]=max(dp[j],dp[j-v0[i]-v1[i]]+v0[i]*p0[i]+v1[i]*p1[i]);}
			else if(j>=v0[i]+v2[i]){
				dp[j]=max(dp[j],dp[j-v0[i]-v2[i]]+v0[i]*p0[i]+v2[i]*p2[i]);
			}
			else if(j>=v0[i]+v1[i]+v2[i]){
				dp[j]=max(dp[j], dp[j - v1[i]- v0[i]- v2[i]]+v0[i]*p0[i]+v1[i]*p1[i]+v2[i]*p2[i]);
			}
			}			
		}
	cout<<dp[n];
}

Supongo que te gusta

Origin blog.csdn.net/m0_52043808/article/details/123977029
Recomendado
Clasificación