蓝桥杯19681 01背包

问题描述

有 N 件物品和一个体积为 M 的背包。第 i 个物品的体积为 vi​,价值为 wi​。每件物品只能使用一次。

请问可以通过什么样的方式选择物品,使得物品总体积不超过 M 的情况下总价值最大,输出这个最大价值即可。

输入格式

第一行输入两个正整数 N,M。(1≤N,M≤1000)

接下来 N 行,每行输入两个整数 vi,wi​。(0≤vi,wi≤1000)

输出格式

输出一个整数,表示符合题目要求的最大价值。

样例输入

复制代码
4 5
1 2
2 4
3 4
4 5

样例输出

复制代码
8

说明

你可以选择第二个物品和第三个物品。

分别考虑前1~4个物品时,背包容量分别为1~5时的最大价值:

cpp 复制代码
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 1e3+10;
int n, m;  //n件物品,体积为m 
int v[N], w[N];
int dp[N];  //dp[j]表示背包容量为j时的最大价值

int main()
{
	cin>>n>>m;
	for(int i=1; i<=n; ++i) cin>>v[i]>>w[i];
	
	for(int i=1; i<=n; ++i)  //遍历每个物品
	{
		for(int j=m; j>=0; j--)  //逆向遍历背包容量,确保每个物品只被考虑一次
		{
			//如果当前物品能放入
			if(j>=v[i])
			{
				//不选当前物品:保持dp[j]不变
				//选当前物品:dp[j-v[i]] + w[i]
				dp[j] = max(dp[j], dp[j-v[i]] + w[i]);
			}
		} 
	}
	
	cout<<dp[m];
	
	return 0;
}
相关推荐
星马梦缘4 小时前
算法设计 期末复习笔记
算法·动态规划·二分图·最小生成树·线性规划·最大流
学究天人8 小时前
数学公理体系大全:第七章 连续统假设与力迫法简介
人工智能·算法·机器学习·数学建模·动态规划·图论·抽象代数
满怀冰雪15 小时前
第29篇-状态压缩DP-当状态很多时如何降维优化
java·算法·动态规划
学究天人1 天前
数学公理体系大全:第一章 命题逻辑:真值之舞
人工智能·算法·机器学习·数学建模·动态规划·图论·抽象代数
旖-旎2 天前
《LeetCode 978 最长湍流子数组 || LeetCode 139 单词拆分》
c++·算法·leetcode·动态规划
学究天人2 天前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(补充卷9)
人工智能·线性代数·算法·数学建模·动态规划·原型模式·抽象代数
初学者,亦行者2 天前
算法设计与分析:动态规划 - TSP问题和0-1背包问题
c++·算法·动态规划
学究天人2 天前
数学公理体系大全:第二章 一阶谓词演算:进入“所有”与“存在”
网络·算法·数学建模·动态规划·图论·抽象代数·拓扑学
学究天人2 天前
数学公理体系大全:第四章 ZFC公理的形式化与构造演算
线性代数·数学建模·矩阵·动态规划·图论·抽象代数·拓扑学
旖-旎2 天前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划