我正在处理可以用java或伪代码完成的作业问题,我正在尝试java代码方式。
背景:有一台机器可以制作iphone外壳。该机器有三种可能的情况,每种情况都有不同的涂料成本。给定原始涂料量,返回可以进行的最小案例量的整数值。
这是我的代码,
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);
}
}
所以在这个例子中,正确的答案是2,而不是3.我的代码有时也会给出。我如何确保它只返回最小数量?
在此之后,我需要将其转变为动态编程程序。 我对此代码的优化或软件工程方面不感兴趣,只是它返回正确的答案。
谢谢。
答案 0 :(得分:2)
因为这看起来像家庭作业,只有几个提示:
动态编程解决方案将是:
递归地说,那就是:
//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;
}
现在,你需要提出一个同样的东西,但不能递归。这将是动态编程。提示:考虑创建一个像递归解决方案这样的大型电子表格,但只需使用一个数组就可以进行递归。