1. Problema A: Problema de empaque.
Superficie del problema:
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:
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
: 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;
}
}