zoukankan      html  css  js  c++  java
  • 背包问题求方案数

    问题描述:

    解法:

    我们让 dp[i] 代表 背包体积恰好为 i 时背包的最大价值 ,再定义一个 g[i] 代表体积为 i 的时候总价值最大的最优选法方案数

    这里注意 dp 的含义与之前的 01背包有点不同,所以我们初始化的时候也需要注意   (具体的可以看之前 01背包详讲)

    统计方案数的时候得看它是从之哪个体积转移过来的

    int n,m;
    int dp[1010],g[1010];
    
    int main() {
        cin >> n >> m;
        dp[0] = 0;
        for (int i = 1;i <= n;i++)
            dp[i] = -INF;
        g[0] = 1;
        for (int i = 1;i <= n;i++) {
            int v,w;
            cin >> v >> w;
            for (int j = m;j >= v;j--) {
                int t = std::max(dp[j],dp[j-v]+w);
                int s = 0;
                if (t == dp[j])
                    s += g[j];
                if (t == dp[j-v]+w)
                    s += g[j-v];
                s %= mod;
                dp[j] = t;
                g[j] = s;
            }
        }
        int maxn = 0;
        for (int i = 0;i <= m;i++) {
            maxn = std::max(dp[i],maxn);
        }
        int cnt = 0;
        for (int i = 0;i <= m;i++) {
            if (dp[i] == maxn) {
                cnt += g[i];
                cnt %= mod;
            }
        }
        printf("%d
    ",cnt);
        return 0;
    }
  • 相关阅读:
    签字文件的保存逻辑
    POJ-1273 Drainage Ditches
    POJ-2513 Colored Sticks
    HDU-1251 统计难题
    POJ-1300 Door Man
    POJ-3159 Candies
    POJ-3169 Layout
    POJ-2983 Is the Information Reliable?
    POJ-1716 Integer Intervals
    HDU-3666 THE MATRIX PROBLEM
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/12252733.html
Copyright © 2011-2022 走看看