#include <bits/stdc++.h>
using namespace std;
const int MX=5005,md=1000000007;
int n,r,i,j,a[MX],f[MX];
int main() {
scanf("%d",&n); r=1;
for (i=0; i<n; i++) {
scanf("%d",&a[i]);
r*=2; if (r>=md) r-=md;
}
if (--r<0) r+=md;
sort(a,a+n);
f[1]=1;
for (i=0; i<n; i++) {
for (j=5000; j>=2*a[i]; j--) {
f[j]+=f[j-a[i]];
if (f[j]>=md) f[j]-=md;
}
for (j=a[i]-1; j>0; j--) if (f[j]) {
r-=f[j]; if (r<0) r+=md;
f[j]*=2; if (f[j]>=md) f[j]-=md;
}
}
printf("%d\n",r);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <bits/stdc++.h> using namespace std; const int MX=5005,md=1000000007; int n,r,i,j,a[MX],f[MX]; int main() { scanf("%d",&n); r=1; for (i=0; i<n; i++) { scanf("%d",&a[i]); r*=2; if (r>=md) r-=md; } if (--r<0) r+=md; sort(a,a+n); f[1]=1; for (i=0; i<n; i++) { for (j=5000; j>=2*a[i]; j--) { f[j]+=f[j-a[i]]; if (f[j]>=md) f[j]-=md; } for (j=a[i]-1; j>0; j--) if (f[j]) { r-=f[j]; if (r<0) r+=md; f[j]*=2; if (f[j]>=md) f[j]-=md; } } printf("%d\n",r); return 0; } |
English