题目:https://nanti.jisuanke.com/t/41420
思路:当a(a∈S′)为最小值
如果Sum(S′)−a≤Sum(S−S′)成立
那么(∀t∈S′,Sum(S′)−t≤Sum(S−S′))恒成立
先算01背包方案数
再从小到大排序进行退背包
#include<bits/stdc++.h> using namespace std; const int mod=1e9+7; int a[400]; int dp[150001]; int main() { int T; scanf("%d",&T); int n; while(T--) { scanf("%d",&n); int s=0,ans=0; for(int i=0;i<n;i++) scanf("%d",&a[i]),s+=a[i]; sort(a,a+n); memset(dp,0,sizeof dp); dp[0]=1; for(int i=0;i<n;i++) for(int j=s;j>=a[i];j--) dp[j]=(dp[j]+dp[j-a[i]])%mod; for(int i=0;i<n;i++) { for(int j=a[i];j<=s;j++) dp[j]=(dp[j]-dp[j-a[i]]+mod)%mod; for(int j=0;j<=s-a[i];j++) if(j+a[i]>=s-(j+a[i])&&j<=s-j-a[i]) ans=(ans+dp[j])%mod; } printf("%d\n",ans); } return 0; }
原文地址:https://www.cnblogs.com/c4Lnn/p/12090711.html
时间: 2024-10-04 01:04:05