sum of subsets

PHOTO EMBED

Mon Nov 18 2024 06:38:31 GMT+0000 (Coordinated Universal Time)

Saved by @login123

import java.util.Scanner;

public class SumOfSubsets {

    static void sumOfSub(int[] weights, int[] x, int s, int k, int r, int m) {
        x[k] = 1;
        if (s + weights[k] == m) {
            printSolutionVector(x, k);
        } else if (s + weights[k] + (k + 1 < weights.length ? weights[k + 1] : 0) <= m) {
            sumOfSub(weights, x, s + weights[k], k + 1, r - weights[k], m);
        }

        if ((s + r - weights[k] >= m) && (s + (k + 1 < weights.length ? weights[k + 1] : 0) <= m)) {
            x[k] = 0;
            sumOfSub(weights, x, s, k + 1, r - weights[k], m);
        }
    }

    static void printSolutionVector(int[] x, int k) {
        System.out.print("Solution Vector: ");
        for (int i = 0; i <= k; i++) {
            System.out.print(x[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter the number of elements in the set: ");
        int n = scanner.nextInt();

        int[] weights = new int[n];

        System.out.println("Enter the elements of the set (in non-decreasing order): ");
        for (int i = 0; i < n; i++) {
            weights[i] = scanner.nextInt();
        }

        System.out.print("Enter the target sum (m): ");
        int m = scanner.nextInt();

        int[] x = new int[n];
        int r = 0;
        for (int weight : weights) {
            r += weight;
        }

        System.out.println("Solution Vectors with sum " + m + ":");
        sumOfSub(weights, x, 0, 0, r, m);

        scanner.close();
    }
}







SumOfSub(s, k, r)
{
    // Generate left child
    x[k] = 1
    if (s + w[k] == m) then
        write(x[1 : k]) // Subset found
    else if (s + w[k] + w[k + 1] <= m) then
        SumOfSub(s + w[k], k + 1, r - w[k])
 
    // Generate right child and evaluate conditions
    if ((s + r - w[k] >= m) and (s + w[k + 1] <= m)) then
    {
        x[k] = 0
        SumOfSub(s, k + 1, r - w[k])
    }
}
content_copyCOPY