codeforces 283C 背包DP

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种。 mbicibici
问 符 合 条 件 的 方 案 数 。 问符合条件的方案数。


题解:

附 加 限 制 条 件 的 完 全 背 包 , 首 先 判 断 图 有 无 成 环 。 附加限制条件的完全背包,首先判断图有无成环。
用 u 、 v 分 别 代 表 b i 、 c i , 易 知 结 点 u 的 数 量 严 格 大 于 v 。 用u、v分别代表b_i、c_i,易知结点u的数量严格大于v。 uvbiciuv
利 用 p r e 数 组 判 断 图 是 否 有 环 , 若 有 环 则 u 、 v 数 量 相 等 , 不 存 在 合 法 方 案 。 利用pre数组判断图是否有环,若有环则u、v数量相等,不存在合法方案。 preuv

  • 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[jw[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; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值