简单DP
#include <iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while (T--)
{
int N,A,B,K;
cin>>N>>A>>B>>K;
int dp[105][105];
int p[105];
memset(dp,0,sizeof(dp));
memset(p,0,sizeof(p));
int m[105];
for (int i=0;i<N;i++)
cin>>m[i];
int max=m[0];
for (int i=0;i<=K;i++)
dp[i][0]=m[0];
for (int i=A;i<N;i++)
{
for (int k=0;k<K;k++)
{
for (int t=A;t<=B;t++)
{
if (i-t>=0&&dp[k+1][i]<dp[k][i-t]+m[i])
dp[k+1][i]=dp[k][i-t]+m[i];
if (dp[k+1][i]>max)
max=dp[k+1][i];
}
}
}
cout<<max<<endl;
}
}