【题解】284E. Coin Troubles(dp+图论建模)

题意就是要你跑一个完全背包,但是要求背包的方案中有个数相对大小的限制

考虑一个\(c_i<c_j\)的限制,就是一个\(c_i\)一定可以对应一个\(c_j\),一个常见的钦定手法是,直接把\(c_j\)的权值捆绑在\(c_i\)上,实现选一个\(c_i\)必选一个\(c_j\)。但是题目里是大于号怎么办,那就直接在背包中钦定先拿一个\(c_j\)即可。

现在问题就是维护这一个捆绑的关系,我们可以直接根据差分约束的那种方法建模出来,然后判断整个图有没有环来判断是否无解。由于题目里保证一些很优美的性质(一个点的出入度各\(\le1\))所以不需要真的拓扑排序。直接每个点记录一下比自己小的点,从每个点跑\(dfs\)就好了,然后假如跑\(dfs\)的时候发现出现了环,直接exit即可。

考虑一下\(<\)的传递性,比如样例1里面的这种情况\(c_3>c_4>c_2\),我们要求钦定两个\(3\),一个\(4\),直接通过\(dfs\)记录一下就好。

很坑的地方就是可能爆int之类的,所以要判断一下....由于我很懒所以我直接瞎几把判断的

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector> using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
} const int maxn=1e5+5;
const int mod=1e9+7;
int dp[maxn];
int data[301];
int sav[301];
int le[301];
int n,m,k,init;
int in[301]; int dfs2(const int&now,const int&d){
in[now]=1;
register int ret=0;
init+=1ll*sav[now]*d;
if(init<0||init>k) puts("0"),exit(0);
if(in[le[now]]) puts("0"),exit(0);
if(le[now]) ret=dfs2(le[now],1);
in[now]=0;
return ret+sav[now];
} int main(){
n=qr(); m=qr(); k=qr();
for(register int t=1;t<=n;++t) sav[t]=data[t]=qr();
for(register int t=1,t1,t2;t<=m;++t){
t1=qr(); t2=qr();
le[t2]=t1;
}
for(register int t=1;t<=n;++t) if(le[t]) data[t]=dfs2(t,0);//,putchar('\n');
for(register int t=1;t<=n;++t) if(data[t]<0) puts("0"),exit(0);
if(init<maxn) dp[init]=1;
for(register int t0=1;t0<=n;++t0)
for(register int t=init+data[t0];t<=k;++t)
dp[t]=(dp[t]+dp[t-data[t0]])%mod;
printf("%d\n",dp[k]);
return 0;
}

【题解】284E. Coin Troubles(dp+图论建模)的更多相关文章

  1. DP&图论 DAY 6 下午 考试

    DP&图论  DAY 6  下午  考试 样例输入 样例输出 题解 >50 pt      dij 跑暴力 (Floyd太慢了QWQ    O(n^3)) 枚举每个点作为起点,dijks ...

  2. UVA.674 Coin Change (DP 完全背包)

    UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...

  3. 【题解】POJ1934 Trip (DP+记录方案)

    [题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...

  4. DP&图论 DAY 7 上午

    DP&图论  DAY 7  上午 图论练习题 P2176 [USACO14FEB]路障Roadblock 先跑最短路(最多n条边,否则出环) 枚举每条边,加倍,再跑 dijkstra 取最大 ...

  5. DP&图论 DAY 6 上午

    DP&图论  DAY 6  上午 双连通分量 从u-->v不存在必经边,点 点双连通分量 边双连通分量 点/边双连通分量缩点之后变成一个树 找连通块的时候不越过割点或者桥 P3469 [ ...

  6. DP&图论 DAY 5 下午

    DP&图论  DAY 5  下午 树链剖分  每一条边要么属于重链要么轻边 证明: https://www.cnblogs.com/sagitta/p/5660749.html 轻边重链都是交 ...

  7. DP&图论 DAY 5 上午

    DP&图论  DAY 5  上午 POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径.现在有一个消息要由某个人开 ...

  8. DP&图论 DAY 4 下午图论

    DP&图论  DAY 4  下午 后天考试不考二分图,双联通 考拓扑排序 图论 图的基本模型 边: 有向边构成有向图 无向边构成无向图 权值: 1.无权 2.点权 3.边权 4.负权(dij不 ...

  9. DP&图论 DAY 4 上午

    DP&图论  DAY 4  上午 概率与期望 概率◦某个事件A发生的可能性的大小,称之为事件A的概率,记作P(A).◦假设某事的所有可能结果有n种,每种结果都是等概率,事件A涵盖其中的m种,那 ...

随机推荐

  1. 阿里靠什么支撑 EB 级计算力?

    作者 关涛 阿里云智能事业群 研究员 导读:MaxCompute 是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务.去年MaxCompute 做了哪些工 ...

  2. shell爬虫

    #!/bin/bash curl_str='curl -x "http://http-pro.abuyun.com:9010" --proxy-basic --proxy-user ...

  3. Java中的Runnable、Callable、Future、FutureTask的区别与示例

    Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. ...

  4. Python语言的缺点

  5. 从遇见到信任 | Apache Dubbo 的毕业之旅

    所谓信任,就是多一次机会. 2018年2月16日,Apache Dubbo 加入 Apache 基金会孵化器. ... 2019年5月16日,Apache 软件基金会董事会决议通过了 Apache D ...

  6. 像Google一样构建机器学习系统3 - 利用MPIJob运行ResNet101

    本系列将利用阿里云容器服务,帮助您上手Kubeflow Pipelines. 第一篇:在阿里云上搭建Kubeflow Pipelines 第二篇:开发你的机器学习工作流 第三篇:利用MPIJob运行R ...

  7. H3C Inverse ARP

  8. 3-7 彻底搞清楚unicode和utf8编码

  9. Eclipse修改控制台字体

    步骤:Window-->Preference-->General-->Appearance-->Colors and Fonts-->Basic-->Text Fo ...

  10. Codevs 均分纸牌(贪心)

    题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸 ...