想了好久才想明白,好笨啊qaq
这个题目的做法是固定左端点,枚举每次移动后,在j位置的偏移量。
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int dp[N][2022];
int v[N];
void sove()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>v[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=2000;j++)dp[i][j]=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=2000;j++)
{ if(j>=v[i])dp[i][j]=max(dp[i-1][j-v[i]]-v[i],0);
if(j+v[i]<=2000)dp[i][j]=min(dp[i][j],dp[i-1][j+v[i]]+v[i]);
}
}
int mi=0x3f3f3f3f;
for(int i=0;i<2000;i++)
mi=min(mi,i+dp[n][i]);
cout<<mi<<"\n";
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie();
std::cout.tie();
int t;
cin>>t;
while(t--)sove();
}