you can find this problem in this link
the dynamic programming equation is:
dp[j][k]=max(dp[j][k],dp[j−len[i]][k]+val[i])
j means the length of current ans ,k means the position of the current stick :in left border ,right border and in the middle of the table.So we have to double the length of each sitcks and the length of table.To be honest , it’s just a sample 01 bags problem.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn = 50000;
ll dp[maxn][3];
int len[maxn];
int val[maxn];
int n,L;
int main()
{
int ca,cat = 1;
cin>>ca;
while(ca--)
{
ll ans = 0;
cin>>n>>L;
L*=2;
for(int i=0;i<n;i++)
{
cin>>len[i]>>val[i];
len[i]*=2;
ans = max(ans,(ll)val[i]);
}
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j = L;j>=len[i]/2;j--)
{
for(int k = 0;k<3;k++)
{
if(j >= len[i])
{
dp[j][k] = max(dp[j][k],dp[j-len[i]][k] + val[i]);
}
if(k > 0)
{
dp[j][k] = max(dp[j][k],dp[j-len[i]/2][k-1]+val[i]);
}
ans = max(ans,dp[j][k]);
}
}
}
cout<<"Case #"<<cat++<<": "<<ans<<endl;
// for(int i = 0;i<=L;i++)
// {
// for(int j = 0;j<3;j++)
// {
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
// cout<<endl;
}
return 0;
}