码迷,mamicode.com
首页 > 其他好文 > 详细

geeksforgeeks@ Minimum sum partition (Dynamic Programming)

时间:2016-07-05 06:25:50      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

http://www.practice.geeksforgeeks.org/problem-page.php?pid=166

Minimum sum partition

Given an array, the task is to divide it into two sets S1 and S2 such that the absolute difference between their sums is minimum.

Input:
The first line contains an integer ‘T‘ denoting the total number of test cases. In each test cases, the first line contains an integer ‘N‘ denoting the size of array. The second line contains N space-separated integers A1, A2, ..., AN denoting the elements of the array.


Output:
In each seperate line print minimum absolute difference.


Constraints:
1<=T<=30
1<=N<=50
1<=A[I]<=50


Example:
Input:
2
4
1 6 5 11
4
36 7 46 40

Output : 
1
23

Explaination :
Subset1 = {1, 5, 6}, sum of Subset1 = 12
Subset2 = {11},       sum of Subset2 = 11

技术分享
import java.util.*;
import java.lang.*;
import java.io.*;

class GFG {
    
    public static int func(int[] arr) {
        
        int n = arr.length, tot = 0;
        for(int i=0; i<n; ++i) {
            tot += arr[i];
        }
        int half = tot/2, e = half;
        
        for(; e>=0; --e) {
            boolean[][] dp = new boolean[n + 1][e + 1];

            for(int i=0; i<=n; ++i) {
                dp[i][0] = true;
            }

            for(int i=1; i<=n; ++i) {
                for(int j=1; j<=e; ++j) {
                    if(j >= arr[i - 1]) {
                        dp[i][j] |= dp[i-1][j] | dp[i-1][j - arr[i-1]];
                    }
                    dp[i][j] |= dp[i-1][j];
                }
            } 
            if(dp[n][e]) break;
        }
        
        //System.out.println(e);
        return Math.abs(e - (tot - e));
    }
    
    public static void main (String[] args) {
        Scanner in = new Scanner(System.in);
        int times = in.nextInt();
        
        while(times > 0) {
            --times;
            
            int n = in.nextInt();
            int[] arr = new int[n];
            for(int i=0; i<n; ++i) {
                arr[i] = in.nextInt();
            }
            
            System.out.println(func(arr));
        }
    }
}
View Code

 

geeksforgeeks@ Minimum sum partition (Dynamic Programming)

标签:

原文地址:http://www.cnblogs.com/fu11211129/p/5642224.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!