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

CF284E Coin Troubles

时间:2020-01-27 00:11:08      阅读:60      评论:0      收藏:0      [点我收藏+]

标签: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]);
}

CF284E Coin Troubles

标签:main   name   ace   价格   pre   code   namespace   void   ems   

原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12234938.html

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