题目链接:http://codeforces.com/contest/284/problem/E

题意:n种类型的硬币,硬币的面值可能相同,现在要在满足一些限制条件下求出,用这些硬币构成t面值的方案数;每个限制条件:a,b表示a种类型的硬币要大于b种类型的硬币;

题解:显然如果哪些条件构成环的话就不存在直接输出0。那么可行的情况下要先预处理一下,假设a>b>c>d

那么最少的选择方式是(3,2,1,0)这个必须先预处理一下,然后还有,假如增加a的数量,那么b,c,d的数

量就不受影响,但是如果增加b的数量,那么a的数量肯定要增加,所以还要预处理一个num[i]表示改变i种硬币

需要增加多少。然后就是完全背包了。

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int M = 1e5 + 10;
ll a[400] , num[400] , dp[M];
int to[400] , pre[400];
vector<int>vc[400];
void dfs(int pos , int cnt) {
vc[cnt].push_back(pos);
if(to[pos] == -1)
return ;
dfs(to[pos] , cnt);
}
int main() {
int n , q , t , u , v;
scanf("%d%d%d" , &n , &q , &t);
for(int i = 1 ; i <= n ; i++) {
scanf("%I64d" , &a[i]);
to[i] = -1;
pre[i] = -1;
}
while(q--) {
scanf("%d%d" , &u , &v);
to[u] = v;
pre[v] = u;
}
int count = 0;
for(int i = 1 ; i <= n ; i++) {
if(pre[i] == -1) {
dfs(i , count);
count++;
}
}
ll sta = 0;
int tot = 0;
for(int i = 0 ; i < count ; i++) {
int len = vc[i].size();
tot += len;
long long sum = 0;
for(int j = 0 ; j < len ; j++) {
int pos = vc[i][j];
sum += a[pos];
num[pos] = sum;
}
sum = 0;
if(len > 1) {
for(int j = 0 ; j < len - 1 ; j++) {
int pos = vc[i][j];
sum += a[pos];
sta += sum;
}
}
}
memset(dp , 0 , sizeof(dp));
if(sta <= t && tot == n) {
dp[sta] = 1;
for(int i = 0 ; i < count ; i++) {
int len = vc[i].size();
for(int j = 0 ; j < len ; j++) {
int pos = vc[i][j];
for(int k = (int)max(sta , num[pos]) ; k <= t ; k++) {
dp[k] += dp[k - num[pos]];
dp[k] %= mod;
}
}
}
}
printf("%I64d\n" , dp[t] % mod);
return 0;
}

codeforces 284 E. Coin Troubles(背包+思维)的更多相关文章

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

    [题解]284E. Coin Troubles(dp+图论建模) 题意就是要你跑一个完全背包,但是要求背包的方案中有个数相对大小的限制 考虑一个\(c_i<c_j\)的限制,就是一个\(c_i\ ...

  2. C. Coin Troubles 有依赖的背包 + 完全背包变形

    http://codeforces.com/problemset/problem/283/C 一开始的时候,看着样例不懂,为什么5 * a1 + a3不行呢?也是17啊 原来是,题目要求硬币数目a3 ...

  3. codeforces 864 E. Fire(背包+思维)

    题目链接:http://codeforces.com/contest/864/problem/E 题解:这题一看就很像背包但是这有3维限制也就是说背包取得先后也会对结果有影响.所以可以考虑sort来降 ...

  4. codeforces 688 E. The Values You Can Make(01背包+思维)

    题目链接:http://codeforces.com/contest/688/problem/E 题解:设dp[s1][s2]表示s1状态下出现s2是否合理.那么s1显然可以更具01背包来得到状态.首 ...

  5. CodeForces - 946D Timetable (分组背包+思维)

    题意 n天的课程,每天有m个时间单位.若时间i和j都有课,那么要在学校待\(j-i+1\)个时间.现在最多能翘k节课,问最少能在学校待多少时间. 分析 将一天的内容视作一个背包的组,可以预处理出该天内 ...

  6. FZU Problem 2214 Knapsack problem(背包+思维转换)

    转化思维,把价值当成背包容量,选择最小的花费,从上到下枚举,找到当这个最小的花费. #include<iostream> #include<cstring> #include& ...

  7. Codeforces 730J:Bottles(背包dp)

    http://codeforces.com/problemset/problem/730/J 题意:有n个瓶子,每个瓶子有一个当前里面的水量,还有一个瓶子容量,问要把所有的当前水量放到尽量少的瓶子里至 ...

  8. Codeforces 305B:Continued Fractions(思维+gcd)

    http://codeforces.com/problemset/problem/305/B 题意:就是判断 p / q 等不等于那条式子算出来的值. 思路:一开始看到 1e18 的数据想了好久还是不 ...

  9. codeforces 876 F. High Cry(思维)

    题目链接:http://codeforces.com/contest/876/problem/F 题解:一道简单的思维题,知道最多一共有n*(n+1)/2种组合,不用直接找答案直接用总的组合数减去不符 ...

随机推荐

  1. Linux下zookeeper下载与安装教程

    原文连接:(http://www.studyshare.cn/blog-front//blog/details/1169/0)一.下载 官网下载:点这里  百度网盘下载:点这里 官网下载图示: jav ...

  2. 现代c++与模板元编程

    最近在重温<c++程序设计新思维>这本经典著作,感慨颇多.由于成书较早,书中很多元编程的例子使用c++98实现的.而如今c++20即将带着concept,Ranges等新特性一同到来,不得 ...

  3. 8天入门docker系列 —— 第八天 让程序跑在swarm集群上

    真正的落地部署都是希望程序跑在集群下,而不是单机版下测测玩玩,所以这篇就来聊一下怎么使用docker swarm进行部署,因为是swarm是docker自带的, 所以部署起来还是非常简单的. 一:前置 ...

  4. 微服务之springboot 自定义配置(一)Application配置文件

    配置的文件的格式 springboot可以识别两种格式的配置文件,分别是yml和properties 文件.我们可以将application.properties文件换成application.yml ...

  5. Redis总结(八)如何搭建高可用的Redis集群

    以前总结Redis 的一些基本的安装和使用,大家可以这这里查看Redis 系列文章:https://www.cnblogs.com/zhangweizhong/category/771056.html ...

  6. HiveQL DDL 常用QL示例资料

    hive-version2.1.1 DDL操作 Create/Drop/Alter/Use Database 创建数据库 //官方指导 CREATE (DATABASE|SCHEMA) [IF NOT ...

  7. flask 异步celery使用

    在开发过程中,耗时长,超时的任务经常发生,比如:获取后端某个大文件数据超时.需要后端计算任务超时,等等, 此时我们就会很自然的想到异步方式,根据需要完成的任务创建一个task_id, 由前端来监听该任 ...

  8. 关于input[type='checkbox']全选的问题

    今天在做一个全选功能的时候,发现了一个问题,就是如果我在选择全选之前,我就已经选择了一个input,然后我再去选择全选并且以后再取消全选的时候,这个我之前选择的input始终处于选择状态,但是他的ch ...

  9. 把Jar包加入windows系统服务

    之前在服务器上不一个Java服务时候,总是开着一堆黑框框,非常不雅,重点是极其容易误关,所以把可执行Jar文件加入Windows系统服务,看起来是个非常不错的选择!(实际上也确实是非常不错的选择) ! ...

  10. Servlet生成验证码并进行账号密码和验证码的验证登陆!

    前言: 人不是生来就懂事的,在编程的世界也是一样,想想在大一的时候我还是那个连输出Hello World!都不会的小孩子是,现在我已经可以编出属于我自己的小程序了.编程其实并不可怕,可怕的是你不去编. ...