码迷,mamicode.com
首页 > 其他好文 > 详细

【2019上海网络赛】

时间:2019-09-16 14:15:27      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:ace   using   最小   scan   for   space   c++   names   scanf   

B题:分成两序列,A>B,A-(a[i]属于A里面的)<=B;

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const ll inf=1e18;
ll dp[300*500+5];
int a[300];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,s=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),s+=a[i];
sort(a+1,a+1+n);
for(int i=1;i<=s;i++)dp[i]=0;
dp[0]=1;
for(int i=1;i<=n;i++)
for(int j=s;j>=a[i];j--)
(dp[j]+=dp[j-a[i]])%=mod;
ll ans=0;
for(int i=1;i<=n;i++)
{
for(int j=a[i];j<=s;j++)///表示去a[i]后的方案数
dp[j]=(dp[j]-dp[j-a[i]]+mod)%mod;
for(int j=max((s+1)/2-a[i],0);j<=s-j-a[i];j++)///因为我们减掉的a【i】得是任意的,那肯定是最小的也得满足,所以我们上面先排序了后一个一个枚举
ans=(ans+dp[j])%mod;
}
printf("%lld\n",ans);
}
return 0;
}

【2019上海网络赛】

标签:ace   using   最小   scan   for   space   c++   names   scanf   

原文地址:https://www.cnblogs.com/hgangang/p/11526688.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!