背包问题求方案数

问题描述:

解法:

我们让 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\n",cnt);
    return 0;
}

原文地址:https://www.cnblogs.com/-Ackerman/p/12252733.html

时间: 2024-10-18 01:16:56

背包问题求方案数的相关文章

POJ 1552 BUY LOW, BUY LOWER(最长单调递减子序列求方案数)

BUY LOW, BUY LOWER Time Limit: 1000MS   Memory Limit: 30000K       Description The advice to "buy low" is half the formula to success in the bovine stock market.To be considered a great investor you must also follow this problems' advice: "

hdu2126(求方案数的01背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 题意: n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数. 分析:一看就想到01背包,不过得加一维来表示能买的物品件数.dp[i][j]表示在i元内至多能买j件物品.则状态转移方程为:dp[i][j]+=dp[i-a[k][j-1]. 最后把在1~m元内买到的最大件数mx加起来就是题目所求. #include <cstdio> #include <cstrin

HDU 2126 01背包(求方案数)

Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1886    Accepted Submission(s): 699 Problem Description When the winter holiday comes, a lot of people will have a trip. Genera

Codeforces 461B. Appleman and Tree[树形DP 方案数]

B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other vertices are color

ZOJ - 2402 DP方案数

题意:给出m,序列第i位是第i-1位的至少2倍大,的求长度为n且每一位范围均在1-m的序列方案数 对求方案数做不到信手拈来的感觉,需要加强 用简单的预处理和最优子结构能优化到很不错的效率了 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<stri

P1466 集合 Subset Sums(01背包求填充方案数)

题目链接:https://www.luogu.org/problem/show?pid=1466 题目大意:对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的.举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子集合的所有数字和是相等的:{3} 和 {1,2}. 解题思路:01背包问题,设sum是1~n之和,其实就是求用数字1~n凑出sum/2的方案数(每个数字只能用一次),概括为以下几点: ①sum为奇数不能平分,直接

poj 3734 方块涂色 求红色 绿色方块都为偶数的方案数 (矩阵快速幂)

N个方块排成一列 用红,蓝,绿,黄4种颜色去涂色,求红色方块 和绿色方块个数同时为偶数的 方案数 对10007取余 Sample Input 212Sample Output 2//(蓝,黄)6//(红红,蓝蓝,蓝黄,绿绿,黄蓝,黄黄) 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <map>

(hdu step 3.1.6)统计问题(求不断地左右走、向上走n步的方案数)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: 统计问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 732 Accepted Submission(s): 466   Problem Description

hdoj 2157 How many ways?? 【矩阵快速幂】【求任意两点间的路径上 经过k个点的方案数】

How many ways?? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2102    Accepted Submission(s): 771 Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这