Summation of multiples of 5 to a given target

Possible duplicate:
Java: summing multiples of 5in a group to a given target

Hello people,

I try my best to make the problem below work without approach in the right direction.

Write a java function that defines an array from int, you can select a group of some from int, so the group summarizes the given target with these additional restrictions: all multiples of 5 in the array must be included in the group. If the value immediately after a multiple of 5 is 1, it should not be selected.

  • groupSum5 (0, {2, 5, 10, 4}, 19) → true
  • groupSum5 (0, {2, 5, 10, 4}, 17) → true
  • groupSum5 (0, {2, 5, 10, 4}, 12) → false
  • groupSum5 (0, {3, 5, 1}, 5) → true
  • groupSum5 (0, {3, 5, 1}, 4) → false

The siganture function is public boolean groupSum5 (int start, int [] nums, int target)

, .

     public boolean groupSum5(int start, int[] nums, int target) {     
           start = 0;     
           boolean flag = false;     
           for(int i=0;i<nums.length;i++){     
             if(nums[i]%5==0){     
                  start+=nums[i];                   
             }else if((start != target) && (start%5==0)){     
                  start+=nums[i];       
             }else if(start == target){      
                  flag = true;      
                  return flag;     
             }else if((nums[i]%5==0) && (nums[i+1]==1)){      
                  continue;                
             }    
           }
            return flag;      
     }     

. .

EDIT DIANTE: , , , .

+3
1

, , . :

package so5987154;

import java.util.Collection;
import java.util.List;
import java.util.Set;

import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

public class Summation {
    /**
     * Sum of start and every element of the collection.
     * 
     * @param start
     *            starting value for the sum
     * @param list
     *            Collection to sum.
     * @return the sum.
     */
    private int sum(final Integer start, final Collection<Integer> list) {
        int sum = start;

        for (final int i : list) {
            sum += i;
        }

        return sum;
    }

    /**
     * Given an array of ints, is it possible to choose a group of some of the ints, such that the group sums to the given target
     * with these additional constraints: all multiples of 5 in the array must be included in the group. If the value immediately
     * following a multiple of 5 is 1, it must not be chosen.
     * 
     * @param start
     *            not used
     * @param nums
     *            array of int (input)
     * @param target
     *            target value for the summation
     * @return true if we found a group that meet the criteria.
     */
    public boolean groupSum5(final int start, final int[] nums, final int target) {
        // list of values that need to be included (multiple of 5)
        final List<Integer> fixed = Lists.newArrayList();

        // list of value that can be included (anything but 1 preceded by a multiple of 5)
        final List<Integer> candidates = Lists.newArrayList();

        // fills candidates and fixed
        for (int i = 0; i < nums.length; i++) {
            final int cand = nums[i];

            if (cand == 1 && i > 0) {
                final int prev = nums[i - 1];
                if (prev % 5 != 0) {
                    candidates.add(cand);
                }
            } else if (cand % 5 == 0) {
                fixed.add(cand);
            } else if (cand <= target) {
                candidates.add(cand);
            }
        }

        // compute the sum of fixed
        final int sumFixed = sum(0, fixed);

        // if the sum of fixed is equals to target we don't need to do anything because
        // we already know we need to return true.
        if (sumFixed == target) {
            return true; // NOPMD
        }

        // if the sum of fixed is greater than target we don't need to do anything because
        // we already know we need to return false (all multiple of 5 must be included)
        // If candidates is empty there no way we can achieve the desired goal.
        if (sumFixed <= target && !candidates.isEmpty()) {
            // generates all subsets of candidates:
            // { 1, 2 } => {}, {1}, {2}, {1, 2}
            final Set<Set<Integer>> powerSet = Sets.powerSet(Sets.newHashSet(candidates));

            // for each found subset, computes the sum of the subset and add it to the sum of
            // multiples of 5 then compare it to target. If equals => return true.
            for (final Set<Integer> set : powerSet) {
                if (sumFixed + sum(0, set) == target) {
                    return true; // NOPMD
                }
            }
        }

        return false;
    }
}

:

package so5987154.tests;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

import so5987154.Summation;

@SuppressWarnings("PMD")
public class SummationTest {
    private final Summation s = new Summation();

    @Test
    public void testGroupSum5() {
        assertTrue(s.groupSum5(0, new int[] { 2, 5, 10, 4 }, 19));
        assertTrue(s.groupSum5(0, new int[] { 2, 5, 10, 4 }, 17));
        assertFalse(s.groupSum5(0, new int[] { 2, 5, 10, 4 }, 12));
        assertTrue(s.groupSum5(0, new int[] { 2, 5, 10, 4 }, 19));
        assertTrue(s.groupSum5(0, new int[] { 3, 5, 1 }, 5));
        assertFalse(s.groupSum5(0, new int[] { 3, 5, 1 }, 4));
        assertTrue(s.groupSum5(0, new int[] { 3, 1 }, 4));
        assertFalse(s.groupSum5(0, new int[] { 3, 1 }, 2));
        assertTrue(s.groupSum5(0, new int[] { 1 }, 1));
    }
}

, start - . ints:

  • 5
  • 1, 5

int.

:

  • test, start = > return true
  • test, start is over target = > return false
  • test, = > return false
  • start + x, x - x = > return OR

: {2, 5, 10, 4}, target = 19

5: 5 + 10 = 15, 1, 5 = > {2, 4}

: method(15, {2, 4}, 19)

  • start == target = > NO
  • start > target = > NO
  • array empty = > NO
  • r1 = (15 + 2, {4}, 19) r2 = (15 + 4, {2}, 19)

(r1): method(15+2, {4}, 19)

  • start == target = > NO
  • start > target = > NO
  • array empty = > NO
  • r11 = (15 + 2 + 4, {}, 19)

(r11): method(15+2+4, {}, 19)

  • start == target = > NO
  • start > target = > YES = > false

(r2): method(15+4, {2}, 19)

  • start == target = > YES = > true

r1 = r11 = false r2 = true = > return false OR true = true, END

, Sets.powerSet r (k)

+2

All Articles