当前位置: 首页 > news >正文

(AcWing)分组背包问题

有 N 组物品和一个容量是 V 的背包。

每组物品有若干个,同一组内的物品最多只能选一个。
每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。

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

输出最大价值。

输入格式

第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。

接下来有 N 组数据:

  • 每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量;
  • 每组数据接下来有 Si 行,每行有两个整数 vij,wij,用空格隔开,分别表示第 i 个物品组的第 j 个物品的体积和价值;

输出格式

输出一个整数,表示最大价值。

数据范围

0<N,V≤100
0<Si≤100
0<vij,wij≤100

输入样例

3 5
2
1 2
2 4
1
3 4
1
4 5

输出样例:

8
#include <iostream>
#include <algorithm>
using namespace std;const int N = 110; // 定义常量N表示物品种类数和最大值int v[N][N], w[N][N], s[N]; // 分别存储每个物品的体积、价值和数量
int f[N]; // 存储背包容量为j时的最大总价值int n, m; // 物品种类数和背包容量int main()
{cin >> n >> m; // 输入物品种类数n和背包容量mfor (int i = 1; i <= n; i++){cin >> s[i]; // 输入第i种物品的数量s[i]for (int j = 1; j <= s[i]; j++)cin >> v[i][j] >> w[i][j]; // 输入第i种物品的体积v[i][j]和价值w[i][j]}for (int i = 1; i <= n; i++) // 遍历每个物品种类{for (int j = m; j >= 0; j--) // 遍历背包容量从m到0{for (int k = 1; k <= s[i]; k++) // 遍历第i种物品的所有数量{if (j >= v[i][k]) // 如果当前背包容量可以放下第i种物品的第k个数量f[j] = max(f[j], f[j - v[i][k]] + w[i][k]); // 更新背包容量为j时的最大总价值}}}cout << f[m] << endl; // 输出背包容量为m时的最大总价值return 0;
}

 

http://www.lryc.cn/news/105629.html

相关文章:

  • JSP项目国际化词条统计
  • Java课题笔记~ MyBatis缓存
  • 数据结构--循环队列、链队
  • hbuilderx主题色分享-github风格
  • 【C++】类与对象(1)
  • Java课题笔记~ MyBatis核心配置
  • 从0开始自学网络安全(黑客)
  • kotlin 编写一个简单的天气预报app(四)增加界面显示
  • 英语不好能学好Python吗?Python常用英文单词汇总
  • Counting Stars 2023“钉耙编程”中国大学生算法设计超级联赛(5)hdu7335
  • 浅谈document.write()输出样式
  • AIGC(Artificial Intelligence and Graph Computing)职业发展路径和前景如何?
  • MySql006——基本的SELECT查询语句
  • 【啥都生】分类项目中的模型搭建代码解析
  • Ubuntu出现了内部错误
  • Stable Diffusion AI绘画初学者指南【概述、云端环境搭建】
  • 小程序动态隐藏分享按钮
  • 语音合成是什么?如何进行语音合成TTS数据采集?
  • 实用干货!一文读懂Salesforce中6种数据关系类型!
  • Spring引入外部数据源
  • word里的页码问题
  • ​LeetCode解法汇总142. 环形链表 II
  • 危化品行业防雷检测综合解决方案
  • 刷题笔记:day 1
  • Linux——平台设备及其驱动
  • 【C语言技巧】三种多组输入的写法
  • DB2数据库巡检脚本
  • Eureka 学习笔记3:EurekaHttpClient
  • Android Framework 之 启动流程
  • Qt、C/C++环境中内嵌LUA脚本、实现LUA函数的调用执行