栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 01背包

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 01背包

01背包

哈喽啊!这是我的第—篇讲解(^o^)/~

谢谢你能点开我的价值千金一文不值的讲解(๑′ᴗ‵๑)

蒟蒻不才,还望大佬多多指教 ……

(此处省略∞字)

—————————————————————————————————

一.例题选择

信息学奥赛一本通:

这个题库来讲,首推 1267:【例9.11】01背包问题 ,以及1290:采药

洛谷:

emmm…,可以选择做一下 P1048 [NOIP2005 普及组] 采药(其实与一本通1290一样),和 P1616 疯狂的采药

再其他的题库就自己去探索吧!(原因是我懒得找)

二.基本思路+要点归纳

1.特点: 每种物品仅有一件,可以选择放或不放

2.状态定义:f[i][v]=前i件物品 (部分或全部) 正好放入一个容量为v的背包中可以获取的最大价值

3.状态转移方程:所以,01背包的状态转移方程便是:

f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i])

{   

对于该式的解读如下图:

}

三.基础代码

代码十分简练 (我参考数据与 1267:【例9.11】01背包问题):

#include
#include
using namespace std;
const int N=35,M=205;
int m,n,f[M],w[N],c[N];
int main(){
	cin>>m>>n;
	for(int i=1;i<=n;i++) cin>>w[i]>>c[i];
	for(int i=1;i<=n;i++)
		for(int j=m;j>=1;j--)
			if(j>=w[i])
				f[j]=max(f[j],f[j-w[i]]+c[i]);
	cout< 

蒟蒻的第一篇讲解,如果有错,大佬麻烦私聊通知,Thanks♪(・ω・)ノ

十分感谢你有耐心读完我的题解 点个赞支持一下吧(〃'▽'〃)

ヾ( ̄▽ ̄)Bye~Bye~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022283.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号