标签:main name ace 价格 pre code namespace void ems
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]);
}
标签:main name ace 价格 pre code namespace void ems
原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12234938.html