博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 283C
阅读量:5314 次
发布时间:2019-06-14

本文共 1390 字,大约阅读时间需要 4 分钟。

题解:

考虑这个东西是带约束条件的完全背包

想办法把xi>xj的约束条件消掉

那么我们把限制条件(xi > xj)看成边 i -> j,连成有向图

发现这个有向图是一堆环和链

有环显然就GG了,然后我们只要考虑全是链的情况

考虑全是链,那么我们消掉约束条件就是每次原有权值加上所有前驱的权值

然后就是一个不带约束条件的完全背包

但是。。。除了出度为0的点意外其他点不能不选

那么就减去不选的方案数就行了

1 #include
2 #define maxn 305 3 #define maxt 100005 4 #define ll long long 5 using namespace std; 6 const ll mod = 1000000007; 7 int n,q,t; 8 int a[maxn]; 9 int pre[maxn],vis[maxn];10 bool h[maxn],hx[maxn];11 ll dp[maxt],f[maxt];12 int main()13 {14 scanf("%d%d%d",&n,&q,&t);15 for(int i=1;i<=n;++i)scanf("%d",&a[i]);16 for(int i=1;i<=n;++i)h[i]=1,hx[i]=1;17 for(int i=1;i<=q;++i)18 {19 int b,c;20 scanf("%d%d",&b,&c);21 pre[b]=c;h[c]=0;hx[b]=0;22 }23 for(int i=1;i<=n;++i)if(h[i])24 for(int x=i;x;x=pre[x])a[pre[x]]+=a[x],vis[x]=1;25 for(int i=1;i<=n;++i)if(!vis[i])26 {27 puts("0");exit(0);28 }29 dp[0]=1;30 for(int i=1;i<=n;++i)31 {32 if(hx[i])33 {34 for(int j=a[i];j<=t;++j)dp[j]=(dp[j]+dp[j-a[i]])%mod;35 }36 else37 {38 memcpy(f,dp,sizeof(f));39 for(int j=a[i];j<=t;++j)dp[j]=(dp[j]+dp[j-a[i]])%mod;40 for(int j=0;j<=t;++j)dp[j]=(dp[j]-f[j]+mod)%mod;41 }42 }43 printf("%I64d\n",dp[t]);44 return 0;45 }
View Code

 

转载于:https://www.cnblogs.com/uuzlove/p/10628291.html

你可能感兴趣的文章
突然感觉需要写点什么
查看>>
机器学习 周志华 第1章习题
查看>>
SOAP UI(ReadyAPI)学习——第一步:资源帖
查看>>
oracle 分组查询
查看>>
SQL server 2008 sa 账户设置失败
查看>>
dp小菜数塔
查看>>
assign、retain、copy使用异同
查看>>
算术验证
查看>>
BLE Android开发中的问题
查看>>
关于面试题 的一点看法
查看>>
java项目打jar包
查看>>
●POJ 2828 Buy Tickets
查看>>
多线程(一)
查看>>
SMA2SATA、PCIe2SATA转换模块(也有叫:Sata Test Fixtures)
查看>>
oracle创建、删除账户
查看>>
MySQL性能剖析工具(pt-query-digest)【转】
查看>>
Serv-U设置允许用户更改密码【转】
查看>>
第十三部分_XWork对输入校验的支持,类型转换与输入校验总结
查看>>
linux 压缩文件的命令总结
查看>>
Html5+CSS
查看>>