1

私は、Java または疑似コードで実行できる宿題の問題に取り組んでいます。Java コードの方法を試しています。

背景: iPhone のケースを作る機械が存在します。マシンには 3 つのケースがあり、それぞれに異なる塗装コストがかかります。元の塗料の量が与えられた場合、作成できるケースの最小量の整数値を返します。

ここに私のコードがあります、

public class ProblemFour
    {   
        //Array entries represent cost for red, green and blue respectively. 
        int[] classicCost = {4, 1, 1};
        int[] coolCost    = {3, 2, 1};
        int[] modernCost  = {1, 3, 2};
        String[] names = {"classic", "cool" , "modern"};
        int red;
        int green;
        int blue;
        Random generator = new Random();
        int pick = generator.nextInt(3);        
    public int minPhone(int r, int g, int b, String mold)
    {
        int counter = 0;
        if (r > 1 && g > 1 && b > 1 && mold.equals("classic"))
        {
            counter += 1;
            red   = r - classicCost[0];
            green = g - classicCost[1];
            blue  = b - classicCost[2];
            Random generator = new Random();
            int pick = generator.nextInt(3);
            counter += minPhone(red, green, blue, names[pick]);
        }
        else if (r > 1 && g > 1 && b > 1 && mold.equals("cool"))
        {
            counter += 1;
            red   = r - coolCost[0];
            green = g - coolCost[1];
            blue  = b - coolCost[2];
            Random generator = new Random();
            int pick = generator.nextInt(3);
            counter += minPhone(red, green, blue, names[pick]);
        }
        else if (r > 1 && g > 1 && b > 1 && mold.equals("modern"))
        {
            counter += 1;
            red   = r - modernCost[0];
            green = g - modernCost[1];
            blue  = b - modernCost[2];
            Random generator = new Random();
            int pick = generator.nextInt(3);
            counter += minPhone(red, green, blue, names[pick]);
        }
        return counter;
    }
}
public static void main(String[] args)
    {

        ProblemSetThree.ProblemFour example = new ProblemFour();
        String[] names = {"classic", "cool" , "modern"};
        Random generator = new Random();
        int pick = generator.nextInt(3);
        //System.out.println(pick);
        int testCount = example.minPhone(6, 7, 7, names[pick]);
        System.out.println(testCount);


    }
} 

したがって、この例では、正解は 3 ではなく 2 です。私のコードでは、どちらかが返されることがあります。最小数のみを返すようにするにはどうすればよいですか?

この後、これを動的プログラミング プログラムに変換する必要があります。このコードの最適化やソフトウェア エンジニアリングの側面には興味がありませんが、正しい答えが返されることだけに関心があります。

ありがとうございました。

4

1 に答える 1

2

これは宿題のように見えるので、いくつかのヒントがあります。

  • これには乱数は必要ありません。

動的計画法のソリューションは次のようになります。

  • 一般的なアイデア:
    • ケース A を作成した場合、今後も作成できるケースの最小数は?
    • ケース B を作成した場合、今後も作成できるケースの最小数は?
    • ケース C を作成した場合、今後も作成できるケースの最小数は?
  • これらのケースの最小値を選択して繰り返します。

再帰的には、次のようになります。

//costs
int[] A = {4, 1, 1};
int[] B = {3, 2, 1};
dint[] C = {1, 3, 2};

public int minPhone(int r, int g, int b){
    int minA = 0;
    int minB = 0;
    int minC = 0;
    if(r-A[0] > 0,g-A[1] > 0,r-A[2] > 0){ //can I make a case A?
        minA = minPhone(r-A[0],g-A[1],r-A[2]);
    }
    if(r-B[0] > 0,g-B[1] > 0,r-B[2] > 0){ //can I make a case B?
        minB = minPhone(r-B[0],g-B[1],r-B[2]);
    }
    if(r-C[0] > 0,g-C[1] > 0,r-C[2] > 0){ //can I make a case C?
        minC = minPhone(r-C[0],g-C[1],r-C[2]);
    }
    minABC = min(minA,min(minB,minC));
    return minABC;
}

ここで、再帰的ではなく同じことを行うバージョンを考え出す必要があります。それが動的計画法です。ヒント: 再帰ソリューションのように大きなスプレッドシートを作成することを考えてみてください。ただし、再帰を使用せずに配列を使用するだけです。

于 2013-10-13T19:31:00.127 に答える