Java 递归打印数组中等于给定和的所有子集
我必须用两种方法编写一个代码,它们将数组(非负)和值和作为参数。 我必须使用以下方法:Java 递归打印数组中等于给定和的所有子集,java,arrays,recursion,subset,subset-sum,Java,Arrays,Recursion,Subset,Subset Sum,我必须用两种方法编写一个代码,它们将数组(非负)和值和作为参数。 我必须使用以下方法: 我们不允许为当前方法添加方法或任何更多参数。 我做了一些类似的事情,只是根据一个和打印来自给定数组的子集的数量。但是我很难改变它来完成这个任务。。。 我的数组长度限制为5 例如: “在数组中输入5个数字” 输入:12345 “在总和中输入一个数字” 投入:8 三, 为什么是3?(3,5)、(1,3,4)、(1,2,5) 谢谢你的帮助 我认为您必须将一个数字数组作为输入,并给出可以等于这个和的整数的和和和数
我们不允许为当前方法添加方法或任何更多参数。 我做了一些类似的事情,只是根据一个和打印来自给定数组的子集的数量。但是我很难改变它来完成这个任务。。。 我的数组长度限制为5 例如: “在数组中输入5个数字” 输入:12345 “在总和中输入一个数字” 投入:8 三, 为什么是3?(3,5)、(1,3,4)、(1,2,5)
谢谢你的帮助 我认为您必须将一个数字数组作为输入,并给出可以等于这个和的整数的和和和数 在您的示例中: 在数组中输入5个数字:1 2 3 4 5 在总和中输入一个数字:83(这里我认为3意味着它只需要3个数字就可以形成8,比如1 2 5和2 3 5..等等) 您可以这样做:
public static void printSubsetSums(int[] arr, int sum, int i) {
// getting all possible sub arrays of a lentgh of i
ArrayList<int[]> subarrays = new ArrayList<int[]>();
ArrayList<Integer> array = new ArrayList<Integer>();
int arrSize = arr.length;
for (int startPoint = 0; startPoint <arrSize ; startPoint++) {
for (int grps = startPoint; grps <=arrSize ; grps++) {
for (int j = startPoint ; j < grps ; j++) {
int element = arr[j];
array.add(element);
}
int[] tab = new int[array.size()];
int x = 0;
for(int n : array) {
tab[x] = n;
x++;
}
subarrays.add(tab);
array.clear();
}
}
// calculating the sum of each one of these arrays
// print the ones that their sum equal the sum given with argument
for(int[] al : subarrays) {
if (al.length==3) {
int sum2 = 0;
for (int n : al) {
sum2 = sum2 + n;
System.out.print(n);
}
System.out.print(" = "+sum2);
if(sum2==sum) { System.out.print(" that is a desired sum"); }
System.out.println();
}
}
}
publicstaticvoidprintsubsetsums(int[]arr,int-sum,int-i){
//获取i的lentgh的所有可能子数组
ArrayList子数组=新的ArrayList();
ArrayList数组=新的ArrayList();
int arrSize=arr.length;
对于(int startPoint=0;startPoint,问题中强加的要求有点难以解释。但是,我已经编写了代码来满足您的用例
我采用的方法如下:
使用位操作方法查找给定数组的所有可能子集
检查子集的和是否等于给定的和。如果是,则在控制台上打印
请查看下面的代码片段以了解更多信息
import java.util.Scanner;
public class SubsetSum {
public static void printSubsetSums(int[] arr, int sum) {
printSubsetSums(arr, sum, 0, "NotNeeded");
}
public static void printSubsetSums(int[] arr, int sum, int i, String acc) {
// variable 'i' and 'acc' are not getting used anywhere.
// Have added because you want to make the same syntax for the function.
boolean isAnySubsetPossible = false;
int n = arr.length;
// Run a loop from 0 to 2^n
for (int p = 0; p < (1 << n); p++) {
int[] temporaryArray = new int[n];
int k = 0;
int m = 1; // m is used to check set bit in binary representation.
// Print current subset
for (int j = 0; j < n; j++) {
if ((p & m) > 0) {
temporaryArray[k++] = arr[j];
}
m = m << 1;
}
int localSum = 0;
for (int temp : temporaryArray) {
localSum += temp;
}
if (localSum == sum) { // check if the sum is equal to the desired sum
isAnySubsetPossible = true;
for (int item : temporaryArray) {
if (item > 0) {
System.out.print(item + " ");
}
}
// print a new line so that next subset starts from new line
System.out.println();
}
}
if (!isAnySubsetPossible) {
System.out.println("There is no subset possible for the sum = " + 20);
}
}
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
System.out.println("Enter 5 numbers into array");
int[] myArr = new int[5];
for (int i = 0; i < myArr.length; i++) {
myArr[i] = myScanner.nextInt();
}
System.out.println("Enter a number into sum");
int sum = myScanner.nextInt();
printSubsetSums(myArr, sum);
}
}
程序输出1
Enter 5 numbers into array
1 2 3 4 5
Enter a number into sum
8
1 3 4
1 2 5
3 5
Enter 5 numbers into array
1 2 3 4 5
Enter a number into sum
20
There is no subset possible for the sum = 20
向程序输入2
Enter 5 numbers into array
1 2 3 4 5
Enter a number into sum
8
1 3 4
1 2 5
3 5
Enter 5 numbers into array
1 2 3 4 5
Enter a number into sum
20
There is no subset possible for the sum = 20
程序输出2
Enter 5 numbers into array
1 2 3 4 5
Enter a number into sum
8
1 3 4
1 2 5
3 5
Enter 5 numbers into array
1 2 3 4 5
Enter a number into sum
20
There is no subset possible for the sum = 20
我希望这能有所帮助。这里有一个递归方法来解决这个问题:
publicstaticvoidprintsubsetsums(int[]arr,int-sum){
打印子项(arr,总和,0,“”);
}
公共静态无效打印子事务(int[]arr,int sum,int i,String acc)
{
如果(总和=0&&!“.equals(acc)){
系统输出打印项次(acc);
acc=“”;
}
如果(i==arr.length){
返回;
}
打印子科目(arr、sum、i+1、acc);
打印子项(arr,总和-arr[i],i+1,acc+“”+arr[i]);
}
说明:
首先,将整数数组和所需的和输入调用帮助器方法的printsubems(int[]arr,int sum)
方法(printsubems(int[]arr,int sum,int i,String acc)
),其中i
是arr
的索引,acc
是
如何达到总和的输出
if(i==arr.length){return;}
作为退出递归方法的基本情况(i
超出范围)
请注意,我们有两个递归调用(printsubsetsum(arr,sum,i+1,acc)
和printsubsetsum(arr,sum-arr[i],i+1,acc+“”+arr[i])
)。如果当前数字无法达到总和,则第一个调用将起作用,因此i
将递增为“重试”下一个数字在arr
中。第二个选项是当前数字将起作用,因此您可以在计算当前数字的同时继续下一个索引(从sum
中减去它,最终达到0[当我们知道所选数字加起来是10]并将其添加到acc
)
最后,我们在和
为0时打印acc
。我们还设置了acc=“”
,并避免在”.equals(acc)
时打印,以避免多次计算同一答案
结果:
输入示例:
3 5
1 3 4
1 2 5
printSubsetSums(新的int[]{1,2,3,4,5},8)
示例输出:
3 5
1 3 4
1 2 5
建议一种算法或方法,在给定所有子集和的情况下打印数组的元素/整数
例如,给定子集的和;{0,1,2,3}-->数组的值为,arr[]={1,2},其子集为{{}->sum为'0',{1}->sum为'1',{2}->sum为2,{1,2}->sum为'3';
注意:给定数组中的所有值均为正N>=0;请编辑您的问题,以包含您的尝试。理想情况下,这是一个最小的、可重复的示例。另外,“将其更改为执行此任务”是什么意思?@NewToJava我编辑了答案,为您提供了解决方案