文字列の入力のためのナップザックソリューション

user6248190:

私は、問題は以下のように説明したオンラインコーディング、テストを持っていました。私は質問を終えることができませんでしたが、潜在的な解決策を考え出すする方法についていくつかのコメントを残しました。私はこの問題を解決するための最善されているかどうか知りたいと思いました。私が持っていた主な問題は、文字列として与えられた入力を分割し、それらを置くために、適切なコレクションを見つけました。以下は疑問です。

あなたは別のものとあなたの友人のパッケージを送りたいです。あなたは、パッケージの内側に入れ、それぞれのものは、インデックス数、重量、コストなどのパラメータを持っています。

パッケージには、重量制限があります。あなたの目標は、総重量は、パッケージの限界に等しいと総コストを可能な限り大きいまたは未満になるように、パッケージに入れているものかを決定することです。

あなたは、同じ価格で複数のパッケージがある場合は少ない量を有するパッケージを送信することを好むだろう。これは、ナップザック問題のバリエーションです。

入力:あなたのプログラムは、標準入力から行を読み込む必要があります。各行は、パッケージが(コロンの前に)取ることができる重量とあなたがから選択する必要が物事のリストが含まれています。各事が第一の数は事のインデックス番号をある括弧で囲まれている、第二は、その重量で、第三は、そのコストです。任意のパッケージが取ることができる最大量は、<= 100.あなたの中から選択する必要がある15件の事にそこにあるかもしれません。最大重量と任意のものの最大コストは<= 100.

出力:物事の各セットのためには、あなたがパッケージに入れていること(そのインデックス番号は、カンマで区切られた)もののリストを作ります。アイテムのいずれもパッケージに収まらない場合は、ハイフンを印刷(-).

テスト1つの入力81 : (1,53.38,$45) (2,88.62,$98) (3,78.48,$3) (4,72.30,$76) (5,30.18,$9) (6,46.34,$48)

予想される出力 4

テスト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)

予想される出力 2,7

Golam Mazidのsajib:

アップあなたの中から選択する必要がある15件の事にあるかもしれません。だから、可能な組み合わせ2 ^ 15 = 32,768を持っています。だから、すべての組み合わせをチェックし、どの組み合わせ満たす要件を見つけることができます。

Exampe:3(1,2,3)のものがあります。次いで、Uが選ぶことができる:()、(1)、(2)、(3)、(1,2)、(1,3)、(2,3)、(1,2,3)。今、どの組み合わせ満たす要件カントー検索を必要としています。

ここでは解決策は以下のとおりです。

 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();
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=188063&siteId=1