

The very first line contains an integer ‘T’ which denotes the number of test cases.
The first line of each test case contains two space-separated integers, ‘N’ and ‘K’, where ‘N’ is the number of things that can be made and ‘K’ is the number of units of clay he has.
The second line of each test case contains ‘N’ integers, where each integer denotes the number of units of clay required for that item.
The third line of each test case contains ‘N’ integers, where each integer denotes the amount of profit the potter can get if that item gets sold out.
For every test case,
Return the maximum profit the potter can make in a new line.
You don’t need to print anything. It has already been taken care of. Just implement the given function.
1 <= T <= 100
1 <= N <= 100
1 <= K <= 100
1 <= profit[i] <= 10000
1 <= Clay[i] <= 2000
Where ‘T’ is the number of test cases , ‘N’ is the number of integers , ‘K’ is the number of units of clay ,Clay[i] is the amount of clay used to build that ith item.
Time Limit: 1sec
We don’t know whether after picking the first item we will reach an optimal solution. It may happen that this item costs too much and its profit is not much, or an item can cost very less with higher profit. Another case could be, an item is costing too much, but then it is providing good profit as well. So we cannot determine whether it is beneficial to take it or not. Hence we will generate two recursive calls. One call in which we take it, and in the other, we leave it. From whichever option we receive the maximum profit, we will return that.
Algorithm:
The idea here is the same, we will make two function calls, but this time we will try to reduce the repetitive calls by using a 2-D array.
In this array, the number of rows denotes the number of items, and the column number denotes the maximum units of clay we have. We can use memoization.
Algorithm :
The recursion tree is for the following sample input.
Clay[] = {1, 1, 1}, K = 2, Profit[] = {10, 20, 30}
(n, K)
(3, 2)
/ \
/ \
(2, 2) (2, 1)
/ \ / \
/ \ / \
(1, 2) (1, 1) (1, 1) (1, 0)
/ \ / \ / \
/ \ / \ / \
(0, 2) (0, 1) (0, 1) (0, 0) (0, 1) (0, 0)
Recursion tree for Knapsack capacity 2
units and 3 items of 1 unit weight. Here we can see the repetitive calls.
The idea here is the same, we will make two function calls, but this time we will try to reduce the repetitive calls by using a 1-D array.
In this array, the elements denote the maximum profit we can have
Algorithm :
this is the case where we used 2-D array but,
We don’t require all the elements of a 2-D array at the same time, so we will try to maintain a 1-D array, and then delete this array, and create another one. The maximum size of the array will be ‘K’. All we need to do is make all the changes in the same 1-D array. Since in each iteration, we don’t actually require the rest of the elements.