Knapsack Lösung für die Eingabe von Zeichenketten

user6248190:

Ich hatte einen Online-Codierung Test, bei dem das Problem, wie unten beschrieben wurde. Ich konnte die Frage nicht beenden, aber einige Anmerkungen verlassen habe, wie mit einer möglichen Lösung zu kommen. Ich wollte wissen, was das Beste gewesen, dieses Problem zu lösen. Das Hauptproblem ich hatte wurde die gegebenen Eingänge als String Aufspalten und eine geeignete Sammlung zu finden, setzen sie in. Im Folgenden ist die Frage.

Sie mögen Ihren Freund ein Paket mit verschiedenen Dingen senden. Jede Sache, die Sie innerhalb eines Paket geschnürt hat solche Parameter wie Indexnummer, Gewicht und Kosten.

Das Paket hat eine Gewichtsbegrenzung. Ihr Ziel ist es, die Dinge zu bestimmen, in die Verpackung gelegt, so dass das Gesamtgewicht kleiner als oder gleich dem Paket Grenze und die Gesamtkosten so groß wie möglich.

Sie würden es vorziehen, ein Paket zu senden, die weniger Gewicht hat, wenn es mehr als ein Paket mit dem gleichen Preis. Dies ist eine Variation des Knapsack Problems.

Input: Ihr Programm soll Zeilen von der Standardeingabe lesen. Jede Zeile enthält das Gewicht , dass ein Paket (vor dem Doppelpunkt) und die Liste der Dinge , nehmen Sie zur Auswahl benötigen. Jedes Ding ist in Klammern eingeschlossen , wo die erste Zahl eine Sache der Indexzahl ist, ist der zweite sein Gewicht und die dritte ist ihre Kosten. Max Gewicht jeder Packung nehmen kann , ist <= 100.es zu 15 Dinge nach oben könnten Sie zur Auswahl benötigen. Max Gewicht und max Kosten für eine Sache ist ,<= 100.

Ausgang: Für jede Menge von Dingen eine Liste der Dinge produzieren (ihre Indexnummern durch Komma getrennt), dass Sie in das Paket geschnürt. Wenn keines der Elemente im Paket passen, drucken Sie einen Bindestrich(-).

Test 1 Eingang81 : (1,53.38,$45) (2,88.62,$98) (3,78.48,$3) (4,72.30,$76) (5,30.18,$9) (6,46.34,$48)

Erwartete Ausgabe 4

Test 2

Test Input 75 : (1,85.31,$29) (2,14.55,$74) (3,3.98,$16) (4,26.24,$55) (5,63.69,$52) (6,76.25,$75) (7,60.02,$74) (8,93.18,$35) (9,89.95,$78)

Erwartete Ausgabe 2,7

Golam Mazid sajib:

Es kann bis zu 15 Dinge, die Sie brauchen zur Auswahl. so haben Sie mögliche Kombination 2 ^ 15 = 32.768. So können Sie jede Kombination überprüfen und herauszufinden, welche Kombination treffen Anforderung.

Exampe: Es gibt 3 (1,2,3) Dinge. u kann dann wählen: (), (1), (2), (3), (1,2), (1,3), (2,3), (1,2,3). Jetzt muß tho finden, die Kombination der Anforderungen erfüllen.

Hier ist Lösung:

 public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String s = in.nextLine();
    String res[] = s.replaceAll("[^0-9.]+",";").split(";");
    double target = Integer.parseInt(res[0]);
    int n = (res.length-1) / 3;
    int[] Index = new int[20];
    double[] P = new double[20];
    double[] W = new double[20];
    int jj = 0;
    for(int i = 1; i < res.length; i +=3){
        Index[jj] = Integer.parseInt(res[i]);
        W[jj] = Double.parseDouble(res[i+1]);
        P[jj++] = Double.parseDouble(res[i+2]);
    }
    double result = 0;
    int track = 0;
    double resSum = 0;
    for(int i =0; i< (1<<n); i++){
        double sum = 0;
        double weight = 0;
        for(int j=0; j < n; j++){
            if(((1<<j)&i) > 0){
                sum+= P[j];
                weight+=W[j];
            }
        }
        if(weight <= target){
            if(sum > resSum){
                result = weight;
                track = i;
                resSum = sum;
            }else if(sum == resSum && weight < result){
                result = weight;
                track = i;
            }
        }
    }
    jj = 0;
    for(int i = 0; i < n; i++){
        if(((1<<i)&track) > 0){
           if(jj > 0){
               System.out.print(",");
           }
           jj = 1;
           System.out.print(Index[i]);
        }
    }
    if(track == 0){
        System.out.println("-");
    }else {
        System.out.println();
    }
}

Ich denke du magst

Origin http://43.154.161.224:23101/article/api/json?id=188059&siteId=1
Empfohlen
Rangfolge