C++求解01背包问题

描述

你是一个探险家,有一天,你在某个神秘的洞穴中发现N件珠宝,每件珠宝上写着其重量wi和价值vi。由于你发现得比较晚,这个地方随时会出现塌陷等事故,这事你就得考虑把一部分珠宝放入你的随身背包中带走,以便不虚此行。但是,由于你个子吃紧,最多可以带走的珠宝总重量不超过W,那你将如何挑选呢?

输入格式

第一行:N M,表示N件珠宝,你的承重能力W

接下来是N行,每行输入wi vi,表示第i件珠宝的单重和单价

输出格式

一行,表示你能带走珠宝的最佳方案所能达到的价值

示例

输入

【3件珠宝,10总承重】

【珠宝重量[9,5,5]】 【珠宝价值[9,5,5]】

cpp 复制代码
3 10
9 9
5 5
3 5

输出

【应该挑第2件和第3件珠宝带走,总重量8小于自身承重,总价值10】

cpp 复制代码
10

代码

cpp 复制代码
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main() {
	int N,W;
	cin>>N>>W;

	vector<int> w(N+1,0);
	vector<int> v(N+1,0);
	for(int i=1; i<=N; i++) {
		cin>>w[i]>>v[i];
	}

	vector<vector<int> > res(N+1,vector<int>(W+1,0));
	for(int i=1; i<=N; i++) {
		for(int j=0; j<=W; j++) {
			if(j<w[i]) {
				res[i][j]=res[i-1][j];
			} else {
				res[i][j]=max(res[i-1][j],res[i-1][j-w[i]]+v[i]);
			}
		}
	}

	cout<<res[N][W]<<endl;
	return 0;
}

运行结果

cpp 复制代码
3 10
9 9
5 5
3 5
10

--------------------------------
Process exited after 6.262 seconds with return value 0
请按任意键继续. . .

解析

把二维数组res当做求解空间 ,第一维度表示已经对前几个珠宝做完决定

第二维度表示已经使用背包载量,使用动态规划算法进行求解。

对于第i件珠宝,如果剩余载量不足,则跟这件珠宝不在没有区别,于是总价不变

但当剩余载量足够,则需要比较载入与否的总价,择优选取。

刚遇到的小伙伴可能难以理解,不要急躁,多看几遍就理解了。

由于举例的数字比较小,大家可以搞个二维表格表示res来帮助理解。

相关推荐
We་ct1 分钟前
LeetCode 300. 最长递增子序列:两种解法从入门到优化
开发语言·前端·javascript·算法·leetcode·typescript
gCode Teacher 格码致知2 分钟前
Python提高: unittest和 pytest的使用方法-由Deepseek产生
开发语言·python·pytest
Johnstons20 分钟前
网络可观测性落地指南:从“出了问题才排查“到“实时感知全网状态“
开发语言·网络·php
wayz1121 分钟前
Day 9 :随机森林调参与时间序列交叉验证
算法·随机森林·机器学习
️是7826 分钟前
信息奥赛一本通—编程启蒙(3371:【例64.2】 生日相同)
开发语言·c++·算法
ZPC821026 分钟前
ROS2 快过UDP的方法
python·算法·机器人
Kiling_070427 分钟前
Java Math类核心用法全解析
java·开发语言
jieyucx30 分钟前
Go 语言运算符与控制台输入输出详解
开发语言·后端·golang
周末也要写八哥34 分钟前
最长递增子序列典型应用题目详解
数据结构·算法
Ulyanov38 分钟前
《玩转QT Designer Studio:从设计到实战》 QT Designer Studio的定位革命与技术架构
开发语言·python·qt·系统仿真·雷达电子对抗仿真