Link
先差分约束看看有没有解。
对于(i)的个数大于(j),可以认为是选一个(j)就一定选一个(i)即(j)的价格加上(i),同时强制(i)选(j)需要强制选的加一个就行了。
#include<bits/stdc++.h>
using namespace std;
const int N=307,M=100007,P=1000000007;
int inc(int a,int b){a+=b;return a>=P? a-P:a;}
int a[N],vis[N],used[N],fa[N],f[M],n,q,t;
int read(){int x;scanf("%d",&x);return x;}
void cal(int x,int num)
{
if(!x) return;
used[x]=1,t-=a[x]*num;
if(t<0) printf("0"),exit(0);
cal(fa[x],num+1),a[x]+=a[fa[x]];
}
int main()
{
n=read(),q=read(),t=read(),f[0]=1;
int i,j,x,y;
for(i=1;i<=n;++i) a[i]=read();
for(i=1;i<=q;++i) x=read(),y=read(),vis[x]=1,fa[y]=x;
for(i=1;i<=n;++i) if(!vis[i]) cal(i,0);
for(i=1;i<=n;++i) if(vis[i]&&!used[i]) return !printf("0");
for(i=1;i<=n;++i) for(j=a[i];j<=t;++j) f[j]=inc(f[j],f[j-a[i]]);
return !printf("%d",f[t]);
}