首页 > 其他分享 >【模板】01背包问题

【模板】01背包问题

时间:2023-05-27 09:13:05浏览次数:43  
标签:01 容量 int max 样例 背包 模板

一个在旅途中的长者有一个最多能用\(M\)公斤的背包,现在有\(n\)件物品,它们的重量分别是\(W1,W2,...,Wn\),它们的价值分别为\(C1,C2,...,Cn\).求旅行者能获得最大总价值。

输入

  • 第1行:两个整数,\(M\)(背包容量,\(M\le200\))和\(n\)(物品数量,\(n\le30\));

  • 第\(2\)至\(n+1\)行:每行两个整数\(Wi\),\(Ci\),表示每个物品的重量和价值。

输出

  • 仅一行,一个数,表示最大总价值。

样例

样例输入1

10 4
2 1
3 3
4 5
7 9

样例输出1

12

解析

好了,这是一个经典的01背包问题

做01背包问题只要记住一个公式

d[j]=max(d[j],d[j-w[i]]+c[i]);

其中 d 数组表示当前容量可以装的最大价值w[i] 是重量,c[i] 是价值

在公式中,我们在装和不装中选一种:

  1. 不装:就是当前的最大重量 d[j]

  2. 装:先在当前容量 j 中给 当前重量 w[i] 预留一个位置 (d[j-w[i]]),然后在加上当前价值 c[i]

最后,用max函数在它们当中选大的那个就可以了

公式中有 ij ,那么这是一个双重循环。

Code

#include <bits/stdc++.h>                 
using namespace std;
int v,n,d[2000],c[50],w[50];     //d数组的下标表示容量
int main()
{
	cin >> v >> n;      //v表示容量,n表示数量 
	for(int i=1;i<=n;i++)
		cin >>w[i] >>c[i];
	for(int i=1;i<=n;i++) 
		for(int j=v;j>=w[i];j--)
			//01背包中,第二重循环要倒序,从v到w[i]
		{
			d[j]=max(d[j],d[j-w[i]]+c[i]);  //公式 
		}
	cout << d[v]; //注意不是d[n] 
	return 0;
}

标签:01,容量,int,max,样例,背包,模板
From: https://www.cnblogs.com/momotrace/p/01backpack-problem.html

相关文章

  • 【模型部署 01】C++实现分类模型(以GoogLeNet为例)在OpenCV DNN、ONNXRuntime、TensorRT
    深度学习领域常用的基于CPU/GPU的推理方式有OpenCVDNN、ONNXRuntime、TensorRT以及OpenVINO。这几种方式的推理过程可以统一用下图来概述。整体可分为模型初始化部分和推理部分,后者包括步骤2-5。以GoogLeNet模型为例,测得几种推理方式在推理部分的耗时如下:结论:GPU加速首选Tens......
  • 1017 A除以B(C++)
    一、问题描述:本题要求计算 A/B,其中 A 是不超过1000位的正整数,B 是1位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。输入格式:输入在一行中依次给出 A 和 B,中间以1空格分隔。输出格式:在一行中依次输出 Q 和 R,中间以1空格分隔。输入样例:123......
  • pwn1_sctf_2016
    先检查一下开了什么保护机制打开32位ida看看这个是啥鸭,像这种c++的代码最难看了,只能一个函数一个函数的百度我在这边简述一下,这些函数一大串就是实现了把s数组中的I整体替换成了you,其他的就没了,然后我们先去找找有没有后门函数之类的找到了一个叫做get_flag的函数,打开一看......
  • 「解题报告」P9195 [JOI Open 2016] JOIRIS
    发现上午高强度想题之后下午就啥都不想干了。神秘构造题,我属实是啥也不会了。先把下标改成从\(0\)开始。首先看到格子上的连续\(k\)的骨牌显然能想到将格子\(k\)染色。而由于有删除一行的操作,按照普通的染色方法好像并不好看,所以我们按列染色。这样我们统计每个颜色上的......
  • 构建之法阅读笔记01
    《现代软件工程构建之法》第一章概论介绍了软件工程的概念、软件危机及其原因,以及现代软件工程的目标、方法和原则。阅读完本章后,我深刻认识到以往自己在软件开发中存在的问题,也对如何提高软件开发的效率和质量有了更深入的思考。个人感受:我过去是怎样做的在实际的软件开发过程中,......
  • 9、背包问题
    内容来自刘宇波老师玩转算法面试1、0-1背包问题publicclassSolution{privatestaticclassNode{publicintindex;publicbooleanb;//w[index]要不要?publicintw;publicintv;publicNodeleft;//w......
  • 23-05-26 刷题-【中缀表达式求值的模板】
    basiccalculator系列题目:(可以作为模板题,记住)224.基本计算器-力扣(LeetCode)[hard]想法:中缀表达式求值。数据结构中栈的应用中缀转后缀。后缀能去掉括号。a+(b+c)*d==》abc+d*+后缀表达式求值:abc+d*+要考虑表达式的优先级,怎么处理括号。括号的优先级,不知......
  • ciscn_2019_n_1
    ciscn_2019_n_1题目分析这题的主要溢出点在于gets(v1),但是这题有两种思路,第一种方法是通过gets函数溢出修改变量v2的值,使v2能够通过if判断语句,执行system函数,第二种方法还是通过gets(v1)溢出,不过这次是通过libc来实现,将ebp覆盖为system函数的地址第一种方法通过学习栈的工作原理,可......
  • 利用函数模板解决双倍功能 利用类模板解决绝对值功能 vector应用测试
    请使用模板参数设计实现双倍功能函数,函数功能要求实现返回值为输入参数的两倍,函数参数应能适应整型、浮点型、双精度型等各种类型,返回值类型与参数一样。裁判测试程序样例: #include<iostream>usingnamespacestd;/*请在这里填写答案*/intmain(void){charc='\0';......
  • kissat分析01_基本数据结构03_frame_trail
      frame.h1#defineINVALID_TRAILUINT_MAX23structframe4{5unsigneddecision;6unsignedtrail:LD_MAX_TRAIL;7unsignedused:2;8boolpromote:1;9};1011//*INDENT-OFF*1213typedefSTACK(frame)frames;1415//*I......