codeforces 283C
题意:
给
定
n
种
硬
币
的
价
值
,
要
求
从
中
选
出
若
干
枚
硬
币
使
得
总
价
值
为
t
。
给定n种硬币的价值,要求从中选出若干枚硬币使得总价值为t。
给定n种硬币的价值,要求从中选出若干枚硬币使得总价值为t。
给
定
m
对
b
i
和
c
i
,
代
表
第
b
i
种
硬
币
的
数
量
严
格
大
于
第
c
i
种
。
给定m对b_i和c_i,代表第b_i种硬币的数量严格大于第c_i种。
给定m对bi和ci,代表第bi种硬币的数量严格大于第ci种。
问
符
合
条
件
的
方
案
数
。
问符合条件的方案数。
问符合条件的方案数。
题解:
附
加
限
制
条
件
的
完
全
背
包
,
首
先
判
断
图
有
无
成
环
。
附加限制条件的完全背包,首先判断图有无成环。
附加限制条件的完全背包,首先判断图有无成环。
用
u
、
v
分
别
代
表
b
i
、
c
i
,
易
知
结
点
u
的
数
量
严
格
大
于
v
。
用u、v分别代表b_i、c_i,易知结点u的数量严格大于v。
用u、v分别代表bi、ci,易知结点u的数量严格大于v。
利
用
p
r
e
数
组
判
断
图
是
否
有
环
,
若
有
环
则
u
、
v
数
量
相
等
,
不
存
在
合
法
方
案
。
利用pre数组判断图是否有环,若有环则u、v数量相等,不存在合法方案。
利用pre数组判断图是否有环,若有环则u、v数量相等,不存在合法方案。
- d p [ j ] = ( d p [ j ] + d p [ j − w [ i ] ] ) dp[j] = (dp[j]+dp[j-w[i]])%mod dp[j]=(dp[j]+dp[j−w[i]])
#include <bits\stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int N = 301;
int w[N], pre[N], vis[N];
int dp[100001];
int main() {
int n, m, t, u, v, cnt = 0;
cin >> n >> m >> t;
for(int i = 1 ; i <= n ; i++){
cin >> w[i];
}
for(int i = 1 ; i <= m ; i++){
cin >> u >> v;
pre[u] = v;
vis[v] = 1;
}
for(int i = 1 ; i <= n && t >= 0 ; i++){
if(!vis[i]){
int sum = 0;
for(int j = i ; j >= 1 && t >= 0 ; j = pre[j]){
cnt++;
sum = w[j] += sum;
t -= (pre[j] ? w[j] : 0);
}
}
}
if(t < 0 || cnt < n){
return cout << 0, 0;
}
dp[0] = 1;
for(int i = 1 ; i <= n ; i++){
for(int j = w[i] ; j <= t ; j++){
dp[j] = (dp[j]+dp[j-w[i]])%mod;
}
}
cout << dp[t] << endl;
return 0;
}