class Solution{
public:
int cut(int val[],int wt[],int n,int W,vector<vector<int>>&t)
{
if(t[n][W]!=-1)
{
return t[n][W];
}
if(wt[n-1]<=W)
{
return(t[n][W]=max(val[n-1]+cut(val,wt,n,W-wt[n-1],t),cut(val,wt,n-1,W,t)));
}
else
{
return(t[n][W]=cut(val,wt,n-1,W,t));
}
}
int cutRod(int val[], int n) {
vector<vector<int>>t(n+1,vector<int>(n+1,-1));
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(i==0 || j==0)
{
t[i][j]=0;
}
}
}
int wt[n]={0};
for(int i=1;i<=n;i++)
{
wt[i-1]=i;
}
int W=n;
return(cut(val,wt,n,W,t));
}
};