在这个问题中,我试图简单地获取项目列表和范围,并找到允许使用所有项目的组合。
这是一个示例:假设您有 4 件物品(苹果、梨、桃子和橙子),并且想要至少 20% 的篮子包含每个物品,最多 60%。例如,您可以拥有每个项目的 25%、25%、25%、25% 或 30%、30%、20%、20% 等,但 0%、0%、50%、50% 没有工作,因为指定的 min% 是 20%。
该程序运行良好,但它使用的项目少于整个列表(而不是每个解决方案中的 4 个项目,某些解决方案包含 2 或 3 个项目,这不是我想要的)。如果我发送一个包含 4 个项目的列表,我想要使用所有 4 个项目的组合,仅此而已。我不希望这样,因为我计划使用大型列表,并且我希望项目的大小过去只是全部,并且不小于 min%。这是使用上述信息的示例(4 项,20-60% 范围):
good:
apples = 22
pears = 24
peach = 25
orange = 29
total: 100%
bad:
apples = 0
pears = 0
peach = 40
orange = 60
total: 100%
// Although total is correct, the example fails because
// the minimum of 20% per item was not obeyed.
我真的很困惑为什么会发生这种情况,但如果我不得不打赌,我认为这是我的递归方式是在将列表中的项目数减去一个然后再将其发回。它在方法中recursion_part
:
private static void recursion_part(int k, int sum, int[] coeff) {
//k is number of items in the list(in this example its 4(0-3), sum is the remaining total percent to break down, coeff is the template to store values
//this recursively takes the sum and tries to find lower values of it until it equals zero using the bounds given
for (int c = low_bound[k]; c <= high_bound[k]; c++) {
coeff[k] = c;
int[] newcoeff = Arrays.copyOf(coeff, coeff.length);
if (c - sum == 0) {
results.add(newcoeff);
printresults(newcoeff);
break;
} else if (k > 0) {
recursion_part(k - 1, sum - c, newcoeff);
}
}
}
我想处理更大的列表,如果它计算出很多我不关心的结果,我认为这将是一个问题。如何重新设计它以仅处理列表中的所有项目并保持在范围限制内?
我想放置一个方法来检查列表中有多少个零,然后如果它低于列表的大小则中断,但我得到空白结果的事实意味着它的处理项目少于我的列表,我我认为最好设计程序,以免浪费资源。
这是整个代码(它按描述工作,但如上所述给出零结果):
import java.util.ArrayList;
import java.util.Arrays;
public class recursion_percent_returner {
static final int target_percent = 100;
static final String[] names = new String[] {"apples", "pears", "peach", "orange" };
static int[] low_bound = new int[names.length];
static int[] high_bound = new int[names.length];
static ArrayList results = new ArrayList(); //queue to store results
static int[] default_coeff = new int[names.length];
public static void main(String[] args) {
System.out.println("starting..");
System.out.println("list size " + names.length);
Arrays.fill(low_bound, 20); //fills the min list with default value
Arrays.fill(high_bound, 60); //fills the max list with default value
recursion_part(names.length-1,target_percent,default_coeff);
System.out.println("total size of results are " + results.size());
}
private static void recursion_part(int k, int sum, int[] coeff) {
//k is number of items in the list(in this example its 4(0-3), sum is the remaining total percent to break down, coeff is the template to store values
//this recursively takes the sum and tries to find lower values of it until it equals zero using the bounds given
for (int c = low_bound[k]; c <= high_bound[k]; c++) {
coeff[k] = c;
int[] newcoeff = Arrays.copyOf(coeff, coeff.length);
if (c - sum == 0) {
results.add(newcoeff);
printresults(newcoeff);
break;
} else if (k > 0) {
recursion_part(k - 1, sum - c, newcoeff);
}
}
}
private static void printresults(int[] newcoeff) {
for (int x = 0; x<newcoeff.length; x++) {
System.out.println(names[x] + " = " + newcoeff[x]);
}
System.out.println("*********");
}
}
我愿意接受更好的方法来实现我正在寻找的结果。
ps 这不是作业,我不是学生;我只是倾向于发现听起来很奇怪的代理问题。
编辑
我包括了整个代码,但这里也是输出。这是 2653 解决方案的一个片段,它产生的比我需要的要多。如果你简单地看一下,你会发现大多数都是正确的,但是当你变低时,你会发现并不是所有的值都被使用了;我只想要使用所有值的解决方案;不应有 0 值条目。