2021-01-10 problema de mochila

1. Problema A: Problema de empaque.
Superficie del problema:
Inserte la descripción de la imagen aquí
Solución del problema:
1. El procesamiento inverso es el procesamiento directo del problema, es decir, la matriz dp se inicializa al tamaño de la mochila y la capacidad correspondiente se resta de cada uno . Para el objeto i-ésimo, elija poner: dp [i] [ja [i]] - a [i] o no poner dp [i-1] [j], dp [i] [j] significa que el primer objeto i simplemente encaja en el volumen j V cuando se viaja con mochila: la capacidad mínima de esta parte de la capacidad. (Para cada uno use directamente v para restar la capacidad máxima actual)
2. Procesamiento hacia adelante, es decir, el dp [i] [j] convencional representa el valor máximo que los primeros objetos i pueden entrar en la mochila con capacidad j, y finalmente Luego reste el máximo final de V.

Convertido a una matriz unidimensional, enumeración inversa j

#include<stdio.h>
#include<bits/stdc++.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#define N 20001
using namespace std;

int main(){
    
    
	int v,n;
	int i,j;
	while(cin>>v>>n){
    
    
		vector<int>a(n+1);
		vector<int>dp(v+1);
		int x;
		for(i=0;i<n;i++){
    
    
			cin>>x;
			a[i]=x;
		}
		for(i=0;i<=v;i++)
		   dp[i]=v;
//		for(i=0;i<n;i++){
    
    
//			for(j=a[i];j<=v;j++){
    
    
//				dp[i][j]=min(dp[i][j],dp[i-1][j-a[i]]-a[i])
//			}
//		}
		
		for(i=0;i<n;i++){
    
    
			for(j=v;j>=a[i];j--){
    
    
				dp[j]=min(dp[j],dp[j-a[i]]-a[i]);
			}
		}
		int min=v;
		for(i=0;i<=v;i++){
    
    
			if(dp[i]<min)
			min=dp[i];
		}
		cout<<min<<endl;
		 
	}
	
}

2. Pregunta B: Recolección de medicamentos
Superficie de la pregunta:
Inserte la descripción de la imagen aquí
Solución del problema : Problema típico de la mochila 01

#include<stdio.h>
#include<bits/stdc++.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#define N 20001
using namespace std;

int main(){
    
    
	int T,M;
	int i,j;
	while(cin>>T>>M){
    
    
		vector<int>t(M+1);
		vector<int>c(M+1);
		vector<int>dp(T+1);
		for(i=1;i<=M;i++){
    
    
			cin>>t[i]>>c[i];
		}
		for(i=1;i<=M;i++){
    
    
			for(j=T;j>=t[i];j--){
    
    
				dp[j]=max(dp[j],dp[j-t[i]]+c[i]);
			}
		}
		int max=0;
		for(i=0;i<=T;i++){
    
    
			if(dp[i]>max)
			max=dp[i];
		}
		cout<<max<<endl;
		
	}
	
	
}

3. Problema de mochila completo sistema monetario
referencia 1
referencia 2 solución del problema de
superficie
Inserte la descripción de la imagen aquí
: problema de mochila completo, preste atención a dp [i] [j] = dp [i-1] [j] + dp [i] [jc [i]] , inicializar dp [i] [0] = 1, lo que equivale a agregar su propia unidad monetaria a 1 caso,
y convertir en una dimensión es dp [0] = 1; Nota: No abrir mucho tiempo para ver ancestros

#include<stdio.h>
#include<bits/stdc++.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
long long int dp[10008];
using namespace std;

int main(){
    
    
	int V,N;
	int i,j;
	while(cin>>V>>N){
    
    
		vector<int>c(V+1);
		memset(dp,0,sizeof(dp));
		for(i=1;i<=V;i++){
    
    
			cin>>c[i];
		}
		dp[0]=1;
		for(i=1;i<=V;i++){
    
    
			for(j=c[i];j<=N;j++){
    
    
				dp[j]+=dp[j-c[i]];
			}
		}
		
		cout<<dp[N]<<endl;
		
	}
		
	
	
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46064382/article/details/112444224
Recomendado
Clasificación