AcWing-4. Problem mit mehreren Rucksäcken (Java-Implementierung)

AcWing-4. Problem mit mehreren Rucksäcken

Themenbeschreibung

Es gibt N Gegenstände und einen Rucksack mit der Kapazität V.

Es gibt höchstens si Teile des i-ten Elements, das Volumen ist vi und der Wert ist wi.

Überlegen Sie, welche Gegenstände Sie in den Rucksack packen, sodass das Gesamtvolumen dieser Gegenstände das Fassungsvermögen des Rucksacks nicht überschreitet und der Gesamtwert am größten ist.
den Maximalwert ausgeben.

Eingabeformat

In der ersten Zeile werden zwei ganze Zahlen, N und V, durch Leerzeichen getrennt, die die Anzahl der Gegenstände bzw. das Volumen des Rucksacks darstellen.

Dann gibt es N Zeilen, und jede Zeile enthält drei durch Leerzeichen getrennte ganze Zahlen vi, wi, si, die jeweils das Volumen, den Wert und die Menge des i-ten Elements darstellen.

Ausgabeformat

Geben Sie eine Ganzzahl aus, die den Maximalwert darstellt.

Datenreichweite

0<N,V≤100
0<vi,wi,si≤100

Eingabebeispiel:

4 5
1 2 3
2 4 1
3 4 3
4 5 2

Beispielausgabe:

10

Ideen (einfache Version)

Zustandsdarstellung: f (i, j), stellt alle von 1 bis i ausgewählten Wertesätze dar, deren Kapazität j nicht überschreitet. Zustandsdarstellung: f(i,j), stellt alle von 1 bis i ausgewählten Wertesätze dar, deren Kapazität j nicht überschreitetStaatsvertretung : f ( i , _j ) ,Stellt alle ausgewählten Wertesätze von 1 bis i dar , deren Kapazität j nicht überschreitet

Attribut: Max. Attribut: MaxAttribute : M a x

Kern: Die letzte Zahl i wird nicht genommen oder k wird genommen (der Maximalwert von k ist die größtmögliche Zahl s von i) Kern: Die letzte Zahl i wird nicht genommen oder k wird genommen (der Maximalwert von k ist der größte). mögliche Anzahl s von i)der Kern:Die letzte Zahl i nimmt nicht an oder nimmt k an ( der Maximalwert von k ist die größtmögliche Zahl s von i )

Zustandsteilung: f ( i − 1 , j ) nimmt 0 i, 1 i ... ... , k i wird zu f ( i , j ) Zustandsteilung: f(i-1,j) nimmt 0 i, 1 i. ..,k i wird zu f(i,j)Landesteilung _:f ( ich1 ,j ) nimm 0 i , _1 ich _,k i werde f ( i , _j )

Die Zustandsübergangsgleichung kann durch Zustandsdivision erhalten werden:
f ( i , j ) = Max ( f ( i − 1 , j ) , f ( i − 1 , j − vi ) + wi , f ( i − 1 , j − 2 ∗ vi ) + 2 ∗ wi , … … , f ( i − 1 , j − k ∗ vi ) + k ∗ wi ) f(i,j) = Max(f(i-1,j),f(i - 1,j-vi)+wi,f(i-1,j-2*vi)+2*wi,...,f(i-1,jk*vi)+k*wi)f ( ich ,j )=M a x ( f ( i1 ,j ) ,f ( ich1 ,Jv i )+w ich ,f ( ich1 ,J2v i )+2w ich ,,f ( ich1 ,Jkv i )+kw i )

Kerncode

		for(int i=1;i<=n;i++) {
    
    
			v = r.nextInt();w = r.nextInt();s = r.nextInt();
			for(int j=1;j<=m;j++) {
    
    
				for(int k=0;k<=s;k++) {
    
    
					if(j<k*v) continue;
					f[i][j] = Math.max(f[i][j],f[i-1][j-k*v]+k*w);
				}
			}
		}

Vollständiger Code

package acWing004;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Main {
    
    
	static int N = 110;
	static int f[][] = new int[N][N];
	static int n,m,v,w,s;
	public static void main(String[] args) throws Exception{
    
    
		Read r = new Read();
		n = r.nextInt();m = r.nextInt();
		for(int i=1;i<=n;i++) {
    
    
			v = r.nextInt();w = r.nextInt();s = r.nextInt();
			for(int j=1;j<=m;j++) {
    
    
				for(int k=0;k<=s;k++) {
    
    
					if(j<k*v) continue;
					f[i][j] = Math.max(f[i][j],f[i-1][j-k*v]+k*w);
				}
			}
		}
		System.out.println(f[n][m]);
	}
}
class Read{
    
    
	StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	public int nextInt() throws Exception{
    
    
		st.nextToken();
		return (int)st.nval;
	}
}

Je suppose que tu aimes

Origine blog.csdn.net/gudada010/article/details/117514305
conseillé
Classement