我有2个输入
array: {3,6,9,0,2,1,3} // positive number and can repeat also
Sum = 9
Need to find a combination(order not mandatory) of array element which has total to Sum(here for example it's 9).
预期输出:
{3,6}
{9}
{6,3}
{3,2,1,3}
我无法解决它。所以,请不要问我的解决方案。请用java帮助解决。
这个问题可以通过打印具有给定和的所有子集来解决。
请查看以下实现:
// A Java program to count all subsets with given sum.
import java.util.ArrayList;
public class SubSet_sum_problem
{
// dp[i][j] is going to store true if sum j is
// possible with array elements from 0 to i.
static boolean[][] dp;
static void display(ArrayList<Integer> v)
{
System.out.println(v);
}
// A recursive function to print all subsets with the
// help of dp[][]. Vector p[] stores current subset.
static void printSubsetsRec(int arr[], int i, int sum,
ArrayList<Integer> p)
{
// If we reached end and sum is non-zero. We print
// p[] only if arr[0] is equal to sun OR dp[0][sum]
// is true.
if (i == 0 && sum != 0 && dp[0][sum])
{
p.add(arr[i]);
display(p);
p.clear();
return;
}
// If sum becomes 0
if (i == 0 && sum == 0)
{
display(p);
p.clear();
return;
}
// If given sum can be achieved after ignoring
// current element.
if (dp[i-1][sum])
{
// Create a new vector to store path
ArrayList<Integer> b = new ArrayList<>();
b.addAll(p);
printSubsetsRec(arr, i-1, sum, b);
}
// If given sum can be achieved after considering
// current element.
if (sum >= arr[i] && dp[i-1][sum-arr[i]])
{
p.add(arr[i]);
printSubsetsRec(arr, i-1, sum-arr[i], p);
}
}
// Prints all subsets of arr[0..n-1] with sum 0.
static void printAllSubsets(int arr[], int n, int sum)
{
if (n == 0 || sum < 0)
return;
// Sum 0 can always be achieved with 0 elements
dp = new boolean[n][sum + 1];
for (int i=0; i<n; ++i)
{
dp[i][0] = true;
}
// Sum arr[0] can be achieved with single element
if (arr[0] <= sum)
dp[0][arr[0]] = true;
// Fill rest of the entries in dp[][]
for (int i = 1; i < n; ++i)
for (int j = 0; j < sum + 1; ++j)
dp[i][j] = (arr[i] <= j) ? (dp[i-1][j] ||
dp[i-1][j-arr[i]])
: dp[i - 1][j];
if (dp[n-1][sum] == false)
{
System.out.println("There are no subsets with" +
" sum "+ sum);
return;
}
// Now recursively traverse dp[][] to find all
// paths from dp[n-1][sum]
ArrayList<Integer> p = new ArrayList<>();
printSubsetsRec(arr, n-1, sum, p);
}
//Driver Program to test above functions
public static void main(String args[])
{
int arr[] = {3, 6, 9, 0, 2, 1, 3};
int n = arr.length;
int sum = 9;
printAllSubsets(arr, n, sum);
}
}
输出:
[6, 3]
[9]
[0, 6, 3]
[0, 9]
[1, 2, 6]
[1, 2, 0, 6]
[3, 6]
[3, 0, 6]
[3, 1, 2, 3]
[3, 1, 2, 0, 3]
问题陈述 任务是检查在长度为N的数组中是否存在K个元素的非连续子数组,其总和等于给定的总和。 例如, 长度为 3 且 sum=7 的非连续子数组为 [1,2,4]。 限制条件: 输出 如果存在 sum=TargetSum 的子数组,我们必须返回 True,如果不可能,则必须返回 False。
我想找到给定正整数数组中元素的最大数目,使得它们的和小于或等于给定的k。例如,我有一个数组 答案是3,因为1,2,3是求和6的最大元素。
设计一个算法,给定一组n个整数和另一个整数x,确定是否存在k(n 我一直在为面试做准备,我遇到了这个算法。我已经解决了问题中指定k的问题。比如2或3。但是我找不到任何可能存在的k的答案。我尝试过用动态规划来解决它,但没有得到结果。有人能帮我吗?
int main(void) { int array[201]; int i; for (i = 0; i < 201; i++) array[i] = i; return 0; } 技巧 在gdb中,如果要打印数组中任意连续元素的值,可以使用“p array[index]@num”命令(p是print命令的缩写)。其中index是数组索引(从0开始计数),num是连
所以,我有一个所有正自然数的数组。给我一个阈值。我必须找出总和小于给定阈值的数字(连续的)的最大计数。 输入数组的最大大小可以为 10^5。 基本上,我想到了一种算法,它计算原始数组的子集中元素的数量,这些元素的总和将小于给定的阈值。但是,这将导致O(N^2).的复杂性有人能建议一个更好的算法吗?我不是在寻找一个代码,只有一个算法/伪代码将做得很好。谢谢!
要从复杂对象中删除某些字段。 我想删除'阴谋'