example: [1, 2, 2, 3]

int func(int[] arr, int target,int  index){
	if(target ==0)
		return 1;

		if(index==0)
		return (arr[0]==target);
		if(target-arr[index]>=0)
	int take =  func(arr, target-arr[index], index-1) 
	int notTake =  fund(arr, target, index-1);
		return take  + notTake;
}

memorisation:

```dp[size][target+1]=-1

int func(int[] arr, int target,int  index, int[][]dp){
	if(target ==0)
		return 1;

		if(index==0)
		return (arr[0]==target);
		if(dp[index][target] !=-1)
			return dp[index][target];
		if(target-arr[index]>=0)
	int take =  func(arr, target-arr[index], index-1) 
	int notTake =  fund(arr, target, index-1);
		return dp[index][target] = (take  + notTake);
}

Ans = dp[n-1][target]



Tabulation :

dp[size][target+1]=0
int func(int[] arr, int target,int  index, int[][]dp){
	for(int i=0;i<arr.length;i++){
		dp[i][0] == 1;
	}

	if(arr[0]<=s) dp[0][arr[0]] = 1;
	
	for(int i=1; i< arr.length;i++){
		for(int j=1;j<target;j++){
				int take = if(arr[i]<=j) dp[i-1][j-arr[j]]
				int notTake =  dp[i-1][j];
				dp[i][j] = take + notTake;
		}
	}
}

Ans = dp[n-1][target]

example:

```[0,0,1]
how can we solve it

No of zeros=2
ways to represent zerp: {0}, {0}, {0, 0}, {0,0,1}
= 2^n * ans without zero = 2^2 * 1 = 4


change memorisation
		if(index==0)
		return (arr[0]==target);
	to
	if(index == 0){
		if(target ==0 && arr[0]==0) return 2;
		if(target == 0 || arr[0] == target) return 1;
		return 0;
	}