题意可抽象为:N个包中每个包容量是T[i],每个包都拿一些,设拿出的总数为sum时的方案数为q,求max(q)
设dp[i][j]为拿了前i个包,共拿出了j物品时的方案数。那么
for i=1 to n
for j=0 to sum
for k=0 to t[i]
dp[i][j]+=dp[i-1][j-k]
但是注意这题中间过程就得取MOD,然而这题求的却是最大值取模而不是取模之后的最大值 【这俩并不一样
可以打表得知dp[N][sum{T[i]}/2]是最大值
#include <iostream>
#include<cstring>
#define MOD 1000000007
#define LL long long
using namespace std;
int N,T;
LL sum;
int t[];
int dp[][]; int main()
{
cin>>T;
while(T--)
{
memset(dp,,sizeof(dp));
sum=; cin>>N;
for(int i=;i<=N;i++)
{
cin>>t[i];
sum+=t[i];
} //cout<<sum<<endl;
sum=sum/;
//cout<<sum<<endl; for(int i=;i<=t[];i++)
dp[][i]=; for(int i=;i<=N;i++)
for(int j=;j<=sum;j++)
for(int k=;k<=t[i];k++)
if(j>=k)
{
//cout<<i%2<<" "<<(i-1)%2<<endl;
dp[i][j]+=dp[i-][j-k]; //dp[i][j]+=dp[i-1][j-k]
dp[i][j]=dp[i][j]%MOD;
} cout<<dp[N][sum]<<endl;
} return ;
}