Q18 Partitions with Given Difference | Practice | GeeksforGeeks

PHOTO EMBED

Wed Jul 26 2023 10:37:03 GMT+0000 (Coordinated Universal Time)

Saved by @Ayush_dabas07

class Solution{
    int m = (int)1e9+7;
    public int countPartitions(int n, int d, int nums[]){
        
        //s1-s2 = d -> s1 = total-s1 -> s2 = (totalsum-d/2)
        //find count of subsets which is equal to (d-totalsum/2)
        //(d-totalsum)/2 should be > 0 && should be even
        int t = 0;
        for(int a : nums)
        t+=a;
        
        int sum = (t-d)/2;
        if(sum < 0 || (t-d)%2 != 0) return 0;
        
        int[][] dp = new int[n][sum+1];
	   //base case
	    if(nums[0] == 0)
        dp[0][0] = 2;
        else
        dp[0][0] = 1;
        if(nums[0] != 0 && nums[0] <= sum)
        dp[0][nums[0]] = 1;
        
	   //rest of the recursion logic
	   for(int i = 1 ;i < n ; i++){
	       for(int j = 0 ; j < sum+1 ; j++){
                
                int notake = dp[i-1][j];
                int take = 0;
                if(j - nums[i] >= 0)
                take = dp[i-1][j-nums[i]];
                
                dp[i][j]=(take+notake)%m;
	       }
	   }
	   
	   return dp[n-1][sum];
    }
    
    	//R-> 2^n M-> n*sum | sc- n + n*sum
	public int solve(int nums[] , int i , int sum , Integer[][] dp){
        if(i == 0){
            if(sum == 0 && nums[0] == 0) return 2;  //take = notake , as its 0
            
            //if sum = 0 dont take , if sum = nums[0] take it
            else if(sum == 0 || sum == nums[0]) return 1;    
            
            else
            return 0;
        }
        if(dp[i][sum] != null)
        return dp[i][sum];
        
        int notake = solve(nums , i-1 , sum , dp);
        
        int take = 0;
        if(sum - nums[i] >= 0)
        take = solve(nums , i-1 , sum-nums[i] , dp);
        
        return dp[i][sum]=(take+notake)%m;
        
    }
}
content_copyCOPY

https://practice.geeksforgeeks.org/problems/partitions-with-given-difference/1