AcWing 11. 背包问题求方案数(01背包计数)

简介: 笔记

背包问题求方案数


题意

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。


第 i 件物品的体积是 vi,价值是 wi。


求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。


输出 最优选法的方案数。注意答案可能很大,请输出答案模 109+7 的结果。


思路

问题背景时 01背包问题 所以求价值的最大值可以直接用 01背包的思路求解:19.png


代码

#include <bits/stdc++.h>
//#define int long long
#define INF 0x3f3f3f3f
#define mod 1000000007
#define endl '\n'
#define rep(i, st, ed) for (int (i) = (st); (i) <= (ed);++(i))
#define pre(i, ed, st) for (int (i) = (ed); i >= (st);--(i))
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
inline int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
inline int lowbit(int x) { return x & -x; }
const int N = 1200;
int n, m;
int w[N], v[N];
int f[N];
int g[N]; // 价值为f[i] 的方案数 
void solve() {
  cin >> n >> m;
  for (int i = 1; i <= n; ++i)cin >> w[i] >> v[i];
  // 价值为f[0] 即价值为0时的方案数为 1 那就是都不选 
  g[0] = 1;
  // 01背包
  for (int i = 1; i <= n; ++i) {
    for (int j = m; j >= w[i]; --j) {
      int maxn = max(f[j], f[j - w[i]] + v[i]);
      int cnt = 0;
      if (maxn == f[j])cnt += g[j];
      if (maxn == f[j - w[i]] + v[i])cnt += g[j - w[i]];
      f[j] = maxn;
      g[j] = cnt % mod;
    }
  }
  // 求出价值最大为多少
  int cnt = 0;
  for (int i = 0; i <= m; ++i) {
    cnt = max(cnt, f[i]);
  }
  //枚举体积 如果当前体积下价值与最大价值相等  那么答案加上 g[j]
  int res = 0;
  for (int i = 0; i <= m; ++i) {
    if (f[i] == cnt)
      res = (res + g[i]) % mod;
  }
  cout << res << endl;
}
signed main() {
  // int t;cin >> t;
  // while(t--)
  solve();
  return 0;
}


目录
相关文章
|
算法 JavaScript Java
使用强大的离线IP地址定位库ip2region获取城市信息
ip2region - 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java、php、c、python、nodejs、golang、c#等查询绑定和Binary,B树,内存三种查询算法。
使用强大的离线IP地址定位库ip2region获取城市信息
|
存储 C语言
大端存储和小端存储
1.大小端字节序 2.大端存储 3.小端存储 4.为什么会有大小端存储模式之分? 5.如何判断当前机器是大端存储还是小端存储 方法1 方法2
3650 0
|
11月前
|
XML Java 数据格式
Spring从入门到入土(xml配置文件的基础使用方式)
本文详细介绍了Spring框架中XML配置文件的使用方法,包括读取配置文件、创建带参数的构造对象、使用工厂方法和静态方法创建对象、对象生命周期管理以及单例和多例模式的测试。
474 7
Spring从入门到入土(xml配置文件的基础使用方式)
|
9月前
|
SQL 安全 PHP
PHP安全性实践:防范常见漏洞与攻击####
本文深入探讨了PHP编程中常见的安全漏洞及其防范措施,包括SQL注入、XSS跨站脚本攻击、CSRF跨站请求伪造等。通过实际案例分析,揭示了这些漏洞的危害性,并提供了具体的代码示例和最佳实践建议,帮助开发者提升PHP应用的安全性。 ####
293 6
|
12月前
|
自然语言处理 Python
【Prompt Engineering提示:Active-Prompt、方向性刺激提示、PAL(程序辅助语言模型)】
Diao等人(2023)提出了一种名为Active-Prompt的新方法,通过自适应提示来优化大型语言模型(LLMs)在特定任务中的表现。此方法通过不确定性评估选择需标注的问题,利用少量人工标注的思维链(CoT)示例逐步优化模型,提高其解决问题的能力。相比固定范例,Active-Prompt能够更有效地针对不同任务调整提示,从而提升模型性能。
410 7
【Prompt Engineering提示:Active-Prompt、方向性刺激提示、PAL(程序辅助语言模型)】
|
10月前
|
JavaScript 开发者 Docker
深入理解Docker容器化技术,打造高效开发环境
深入理解Docker容器化技术,打造高效开发环境
|
Java 数据库连接 数据库
【MyBatis】spring整合mybatis教程(详细易懂)
Spring提供了一种轻量级的容器和依赖注入的机制,可以简化应用程序的配置和管理。会初始化N个数据库链接对象,一般在10个,当需要用户请求操作数据库时候,那么就会直接在数据库连接池中获取链接,用完放回连接池中。我们的实体类创建属性的时候我写get、set等方法,过于麻烦,但是我们有一个lombok,可以节约掉这些。这里是自己本地路径的MySQL的jar包,是需要更改的,路径赋值后也需要再加上。把我们的生成的BookMapper里面的方法复制到我们新建的BookBiz里面。选中对应的项目,依次选中生成。
【MyBatis】spring整合mybatis教程(详细易懂)
|
存储 人工智能 小程序
比赛须知【2024 年睿抗机器人开发者大赛CAIP-编程技能赛(国赛)】
该文章是关于2024年睿抗机器人开发者大赛CAIP-编程技能赛(国赛)的参赛通知,强调了比赛时间、阅读比赛须知的重要性,并列举了多项比赛期间禁止的行为以确保比赛的公平性。
 比赛须知【2024 年睿抗机器人开发者大赛CAIP-编程技能赛(国赛)】
|
SQL 缓存 Java
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
简化数据库访问:通过配置文件或注解的方式来定义数据库操作,减少了传统的JDBC编码工作量。 灵活性:支持自定义SQL语句,可以编写复杂的SQL语句来满足特定的需求。
579 0
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
266 3