题目链接
很容易看出,dp公式为 dp[i][j]=dp[i-1][j-a[i]]+dp[i-1][-j];
但是dp数组下标有负数,所以我们将二维加一个add值。
add>300*666;
然而这样开二维数组会爆,我们就把一维降为两个空间。
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int mod=1e8+7;
const int add=666*305;
ll dp[2][add*2];
ll a[340];
int cnt,n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
dp[0][add]=1;
for(int i=1;i<=n;i++)
{
cnt=i%2;
for(int j=-300*600;j<=300*666;j++)
{
dp[cnt][j+add]=dp[cnt^1][j-a[i]+add]+dp[cnt^1][add-j];
dp[cnt][j+add]%=mod;
}
dp[cnt][add+666]=0;
}
cout<<dp[n%2][-666+add]<<endl;
return 0;
}